From 2903d63ee6ae326c6593e8f14d89470a7003dc2d Mon Sep 17 00:00:00 2001 From: liangzai <2440983361@qq.com> Date: Wed, 18 Sep 2024 16:35:40 +0800 Subject: [PATCH] v1.0 --- .env.development | 1 + .env.production | 1 + .eslintrc.json | 7 + .gitignore | 38 + Dockerfile | 23 + README.md | 36 + next.config.mjs | 43 + package-lock.json | 6829 +++++++++++++++++ package.json | 41 + postcss.config.mjs | 8 + src/apis/auth.ts | 21 + src/app/(console)/create/page.tsx | 24 + src/app/(console)/home/page.tsx | 3 + src/app/(console)/layout.tsx | 23 + src/app/(console)/loading.tsx | 14 + src/app/(console)/projects/page.tsx | 129 + src/app/(console)/queue/page.tsx | 3 + src/app/(main)/layout.tsx | 24 + src/app/(main)/page.tsx | 20 + src/app/(main)/pricing/page.tsx | 247 + src/app/(main)/terms/page.tsx | 30 + src/app/favicon.ico | Bin 0 -> 25931 bytes src/app/globals.scss | 103 + src/app/layout.tsx | 57 + src/app/loading.tsx | 14 + src/app/login/login.module.css | 12 + src/app/login/page.tsx | 69 + src/components/GlobalLoading.tsx | 21 + src/components/InputBox.tsx | 23 + src/components/ListBox.tsx | 67 + src/components/Loading.tsx | 15 + src/components/PaymentDialog.tsx | 57 + src/components/UploadAudio.tsx | 204 + src/components/UploadImage.tsx | 76 + src/components/logics/UserInfo.tsx | 24 + src/contexts/CombinedProviders.tsx | 9 + src/contexts/ToastContext/index.tsx | 103 + src/contexts/UserContext.tsx | 55 + src/hooks/useFetch.tsx | 173 + src/i18n/request.ts | 27 + src/middleware.ts | 54 + src/models/routes.ts | 17 + src/store/loadingStore.ts | 18 + src/store/userStore.ts | 24 + src/ui/(console)/create/article.tsx | 3 + .../(console)/create/avatar/index.module.css | 38 + src/ui/(console)/create/avatar/index.tsx | 653 ++ src/ui/(console)/create/components/video.tsx | 317 + src/ui/(console)/create/create-tabs.tsx | 128 + .../create/imageVideo/index.module.css | 38 + src/ui/(console)/create/imageVideo/index.tsx | 289 + .../(console)/create/music/index.module.css | 38 + src/ui/(console)/create/music/index.tsx | 589 ++ src/ui/(console)/create/review.tsx | 3 + .../create/textVideo/index.module.css | 38 + src/ui/(console)/create/textVideo/index.tsx | 474 ++ .../(console)/create/tiktok/index.module.css | 38 + src/ui/(console)/create/tiktok/index.tsx | 640 ++ src/ui/(console)/projects/video-item.tsx | 116 + src/ui/(console)/side-bar.tsx | 202 + src/ui/login/google-login.tsx | 33 + src/ui/login/js/GridArrayBg.module.js | 1 + src/ui/login/login-form.tsx | 286 + src/ui/login/register-form.tsx | 301 + src/ui/page/page-Teach.tsx | 303 + src/ui/page/page-expect.tsx | 119 + src/ui/page/page-faqs.tsx | 449 ++ src/ui/page/page-footer.tsx | 37 + src/ui/page/page-header.tsx | 64 + src/ui/page/page-intro.tsx | 74 + src/ui/page/page-remark.tsx | 110 + src/ui/page/page-statis.tsx | 44 + src/ui/page/page-tools.tsx | 368 + src/utils/request.ts | 138 + src/utils/utils.ts | 10 + tailwind.config.ts | 81 + tsconfig.json | 33 + 77 files changed, 14842 insertions(+) create mode 100644 .env.development create mode 100644 .env.production create mode 100644 .eslintrc.json create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 README.md create mode 100644 next.config.mjs create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 postcss.config.mjs create mode 100644 src/apis/auth.ts create mode 100644 src/app/(console)/create/page.tsx create mode 100644 src/app/(console)/home/page.tsx create mode 100644 src/app/(console)/layout.tsx create mode 100644 src/app/(console)/loading.tsx create mode 100644 src/app/(console)/projects/page.tsx create mode 100644 src/app/(console)/queue/page.tsx create mode 100644 src/app/(main)/layout.tsx create mode 100644 src/app/(main)/page.tsx create mode 100644 src/app/(main)/pricing/page.tsx create mode 100644 src/app/(main)/terms/page.tsx create mode 100644 src/app/favicon.ico create mode 100644 src/app/globals.scss create mode 100644 src/app/layout.tsx create mode 100644 src/app/loading.tsx create mode 100644 src/app/login/login.module.css create mode 100644 src/app/login/page.tsx create mode 100644 src/components/GlobalLoading.tsx create mode 100644 src/components/InputBox.tsx create mode 100644 src/components/ListBox.tsx create mode 100644 src/components/Loading.tsx create mode 100644 src/components/PaymentDialog.tsx create mode 100644 src/components/UploadAudio.tsx create mode 100644 src/components/UploadImage.tsx create mode 100644 src/components/logics/UserInfo.tsx create mode 100644 src/contexts/CombinedProviders.tsx create mode 100644 src/contexts/ToastContext/index.tsx create mode 100644 src/contexts/UserContext.tsx create mode 100644 src/hooks/useFetch.tsx create mode 100644 src/i18n/request.ts create mode 100644 src/middleware.ts create mode 100644 src/models/routes.ts create mode 100644 src/store/loadingStore.ts create mode 100644 src/store/userStore.ts create mode 100644 src/ui/(console)/create/article.tsx create mode 100644 src/ui/(console)/create/avatar/index.module.css create mode 100644 src/ui/(console)/create/avatar/index.tsx create mode 100644 src/ui/(console)/create/components/video.tsx create mode 100644 src/ui/(console)/create/create-tabs.tsx create mode 100644 src/ui/(console)/create/imageVideo/index.module.css create mode 100644 src/ui/(console)/create/imageVideo/index.tsx create mode 100644 src/ui/(console)/create/music/index.module.css create mode 100644 src/ui/(console)/create/music/index.tsx create mode 100644 src/ui/(console)/create/review.tsx create mode 100644 src/ui/(console)/create/textVideo/index.module.css create mode 100644 src/ui/(console)/create/textVideo/index.tsx create mode 100644 src/ui/(console)/create/tiktok/index.module.css create mode 100644 src/ui/(console)/create/tiktok/index.tsx create mode 100644 src/ui/(console)/projects/video-item.tsx create mode 100644 src/ui/(console)/side-bar.tsx create mode 100644 src/ui/login/google-login.tsx create mode 100644 src/ui/login/js/GridArrayBg.module.js create mode 100644 src/ui/login/login-form.tsx create mode 100644 src/ui/login/register-form.tsx create mode 100644 src/ui/page/page-Teach.tsx create mode 100644 src/ui/page/page-expect.tsx create mode 100644 src/ui/page/page-faqs.tsx create mode 100644 src/ui/page/page-footer.tsx create mode 100644 src/ui/page/page-header.tsx create mode 100644 src/ui/page/page-intro.tsx create mode 100644 src/ui/page/page-remark.tsx create mode 100644 src/ui/page/page-statis.tsx create mode 100644 src/ui/page/page-tools.tsx create mode 100644 src/utils/request.ts create mode 100644 src/utils/utils.ts create mode 100644 tailwind.config.ts create mode 100644 tsconfig.json diff --git a/.env.development b/.env.development new file mode 100644 index 0000000..3ba7c8c --- /dev/null +++ b/.env.development @@ -0,0 +1 @@ +NEXT_PUBLIC_BASEURL=https://www.typeframes.cc/api \ No newline at end of file diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..3ba7c8c --- /dev/null +++ b/.env.production @@ -0,0 +1 @@ +NEXT_PUBLIC_BASEURL=https://www.typeframes.cc/api \ No newline at end of file diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..8327cfd --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,7 @@ +{ + "extends": "next/core-web-vitals", + "rules": { + "react/no-unescaped-entities": "off", + "react/jsx-no-duplicate-props": "off" + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ebeeeeb --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js +.yarn/install-state.gz + +/public + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..0329b96 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,23 @@ +# 使用指定的 Node.js 版本作为基础镜像 +FROM node:20.15.1 + +# 设置工作目录 +WORKDIR /app + +# 复制 package.json 和 package-lock.json(如果有)到工作目录 +COPY package*.json ./ + +# 安装依赖 +RUN npm install + +# 复制项目的所有文件到工作目录 +COPY . . + +# 构建 Next.js 项目 +RUN npm run build + +# 暴露应用运行的端口 +EXPOSE 12680 + +# 启动 Next.js 服务 +CMD ["npm", "start"] diff --git a/README.md b/README.md new file mode 100644 index 0000000..c403366 --- /dev/null +++ b/README.md @@ -0,0 +1,36 @@ +This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. + +This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. diff --git a/next.config.mjs b/next.config.mjs new file mode 100644 index 0000000..8f7055f --- /dev/null +++ b/next.config.mjs @@ -0,0 +1,43 @@ +import { fileURLToPath } from 'url'; +import path from 'path'; +import createNextIntlPlugin from 'next-intl/plugin'; + +const withNextIntl = createNextIntlPlugin(); + +/** @type {import('next').NextConfig} */ +const nextConfig = { + images: { + formats: ["image/avif", "image/webp"], + remotePatterns: [ + { + protocol: "https", + hostname: "typeframes.ai", + port: "", + pathname: "/_next/image/**", + }, + ], + domains: ['www.typeframes.com'], // 允许从该域名加载图片资源 + + }, + sassOptions: { + includePaths: [path.join(path.dirname(fileURLToPath(import.meta.url)), 'styles')], + }, + async rewrites() { + return [ + { + source: '/api/:path*', + destination: 'https://www.typeframes.cc/api/:path*/', + }, + { + source: '/oauth2callback/:path*', + destination: 'https://www.typeframes.cc/oauth2callback/:path*/', + }, + { + source: '/google/:path*', + destination: 'https://www.typeframes.cc/google/:path*/', + }, + ]; + }, +}; + +export default withNextIntl(nextConfig); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..bf95af0 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6829 @@ +{ + "name": "typeframes-ai", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "typeframes-ai", + "version": "0.1.0", + "dependencies": { + "@headlessui/react": "^2.1.2", + "@radix-ui/react-collapsible": "^1.1.0", + "@radix-ui/react-dialog": "^1.1.1", + "@radix-ui/react-tabs": "^1.1.0", + "@radix-ui/react-toast": "^1.2.1", + "@radix-ui/themes": "^3.1.1", + "classnames": "^2.5.1", + "framer-motion": "^11.3.28", + "next": "14.2.5", + "next-intl": "^3.19.0", + "query-string": "^9.1.0", + "react": "^18", + "react-dom": "^18", + "react-icons": "^5.2.1", + "zustand": "^4.5.5" + }, + "devDependencies": { + "@tailwindcss/forms": "^0.5.7", + "@types/node": "^20", + "@types/react": "^18", + "@types/react-dom": "^18", + "daisyui": "^4.12.10", + "eslint": "^8", + "eslint-config-next": "14.2.5", + "postcss": "^8", + "sass": "^1.77.8", + "tailwindcss": "^3.4.1", + "typescript": "^5" + } + }, + "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/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.6.5", + "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.6.5.tgz", + "integrity": "sha512-8GrTWmoFhm5BsMZOTHeGD2/0FLKLQQHvO/ZmQga4tKempYRLz8aqJGqXVuQgisnMObq2YZ2SgkwctN1LOOxcqA==", + "dependencies": { + "@floating-ui/utils": "^0.2.5" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.8", + "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.6.8.tgz", + "integrity": "sha512-kx62rP19VZ767Q653wsP1XZCGIirkE09E0QUGNYTM/ttbbQHqcGPdSfWFxUyyNLc/W6aoJRBajOSXhP6GXjC0Q==", + "dependencies": { + "@floating-ui/core": "^1.6.0", + "@floating-ui/utils": "^0.2.5" + } + }, + "node_modules/@floating-ui/react": { + "version": "0.26.21", + "resolved": "https://registry.npmmirror.com/@floating-ui/react/-/react-0.26.21.tgz", + "integrity": "sha512-7P5ncDIiYd6RrwpCDbKyFzvabM014QlzlumtDbK3Bck0UueC+Rp8BLS34qcGBcN1pZCTodl4QNnCVmKv4tSxfQ==", + "dependencies": { + "@floating-ui/react-dom": "^2.1.1", + "@floating-ui/utils": "^0.2.6", + "tabbable": "^6.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/@floating-ui/react-dom/-/react-dom-2.1.1.tgz", + "integrity": "sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg==", + "dependencies": { + "@floating-ui/dom": "^1.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.6", + "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.6.tgz", + "integrity": "sha512-0KI3zGxIUs1KDR/pjQPdJH4Z8nGBm0yJ5WRoRfdw1Kzeh45jkIfA0rmD0kBF6fKHH+xaH7g8y4jIXyAV5MGK3g==" + }, + "node_modules/@formatjs/ecma402-abstract": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/@formatjs/ecma402-abstract/-/ecma402-abstract-2.0.0.tgz", + "integrity": "sha512-rRqXOqdFmk7RYvj4khklyqzcfQl9vEL/usogncBHRZfZBDOwMGuSRNFl02fu5KGHXdbinju+YXyuR+Nk8xlr/g==", + "dependencies": { + "@formatjs/intl-localematcher": "0.5.4", + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/fast-memoize": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/@formatjs/fast-memoize/-/fast-memoize-2.2.0.tgz", + "integrity": "sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/icu-messageformat-parser": { + "version": "2.7.8", + "resolved": "https://registry.npmmirror.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.7.8.tgz", + "integrity": "sha512-nBZJYmhpcSX0WeJ5SDYUkZ42AgR3xiyhNCsQweFx3cz/ULJjym8bHAzWKvG5e2+1XO98dBYC0fWeeAECAVSwLA==", + "dependencies": { + "@formatjs/ecma402-abstract": "2.0.0", + "@formatjs/icu-skeleton-parser": "1.8.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/icu-skeleton-parser": { + "version": "1.8.2", + "resolved": "https://registry.npmmirror.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.2.tgz", + "integrity": "sha512-k4ERKgw7aKGWJZgTarIcNEmvyTVD9FYh0mTrrBMHZ1b8hUu6iOJ4SzsZlo3UNAvHYa+PnvntIwRPt1/vy4nA9Q==", + "dependencies": { + "@formatjs/ecma402-abstract": "2.0.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/intl-localematcher": { + "version": "0.5.4", + "resolved": "https://registry.npmmirror.com/@formatjs/intl-localematcher/-/intl-localematcher-0.5.4.tgz", + "integrity": "sha512-zTwEpWOzZ2CiKcB93BLngUX59hQkuZjT2+SAQEscSm52peDW/getsawMcWF1rGRpMCX6D7nSJA3CzJ8gn13N/g==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@headlessui/react": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/@headlessui/react/-/react-2.1.2.tgz", + "integrity": "sha512-Kb3hgk9gRNRcTZktBrKdHhF3xFhYkca1Rk6e1/im2ENf83dgN54orMW0uSKTXFnUpZOUFZ+wcY05LlipwgZIFQ==", + "dependencies": { + "@floating-ui/react": "^0.26.16", + "@react-aria/focus": "^3.17.1", + "@react-aria/interactions": "^3.21.3", + "@tanstack/react-virtual": "^3.8.1" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": "^18", + "react-dom": "^18" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "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/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@next/env": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.5.tgz", + "integrity": "sha512-/zZGkrTOsraVfYjGP8uM0p6r0BDT6xWpkjdVbcz66PJVSpwXX3yNiRycxAuDfBKGWBrZBXRuK/YVlkNgxHGwmA==" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.5.tgz", + "integrity": "sha512-LY3btOpPh+OTIpviNojDpUdIbHW9j0JBYBjsIp8IxtDFfYFyORvw3yNq6N231FVqQA7n7lwaf7xHbVJlA1ED7g==", + "dev": true, + "dependencies": { + "glob": "10.3.10" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.5.tgz", + "integrity": "sha512-/9zVxJ+K9lrzSGli1///ujyRfon/ZneeZ+v4ptpiPoOU+GKZnm8Wj8ELWU1Pm7GHltYRBklmXMTUqM/DqQ99FQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.5.tgz", + "integrity": "sha512-vXHOPCwfDe9qLDuq7U1OYM2wUY+KQ4Ex6ozwsKxp26BlJ6XXbHleOUldenM67JRyBfVjv371oneEvYd3H2gNSA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.5.tgz", + "integrity": "sha512-vlhB8wI+lj8q1ExFW8lbWutA4M2ZazQNvMWuEDqZcuJJc78iUnLdPPunBPX8rC4IgT6lIx/adB+Cwrl99MzNaA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.5.tgz", + "integrity": "sha512-NpDB9NUR2t0hXzJJwQSGu1IAOYybsfeB+LxpGsXrRIb7QOrYmidJz3shzY8cM6+rO4Aojuef0N/PEaX18pi9OA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.5.tgz", + "integrity": "sha512-8XFikMSxWleYNryWIjiCX+gU201YS+erTUidKdyOVYi5qUQo/gRxv/3N1oZFCgqpesN6FPeqGM72Zve+nReVXQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.5.tgz", + "integrity": "sha512-6QLwi7RaYiQDcRDSU/os40r5o06b5ue7Jsk5JgdRBGGp8l37RZEh9JsLSM8QF0YDsgcosSeHjglgqi25+m04IQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.5.tgz", + "integrity": "sha512-1GpG2VhbspO+aYoMOQPQiqc/tG3LzmsdBH0LhnDS3JrtDx2QmzXe0B6mSZZiN3Bq7IOMXxv1nlsjzoS1+9mzZw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.5.tgz", + "integrity": "sha512-Igh9ZlxwvCDsu6438FXlQTHlRno4gFpJzqPjSIBZooD22tKeI4fE/YMRoHVJHmrQ2P5YL1DoZ0qaOKkbeFWeMg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.5.tgz", + "integrity": "sha512-tEQ7oinq1/CjSG9uSTerca3v4AZ+dFa+4Yu6ihaG8Ud8ddqLQgFGcnwYls13H5X5CPDPZJdYxyeMui6muOLd4g==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "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/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@radix-ui/colors": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/@radix-ui/colors/-/colors-3.0.0.tgz", + "integrity": "sha512-FUOsGBkHrYJwCSEtWRCIfQbZG7q1e6DgxCIOe1SUQzDe/7rXXeA47s8yCn6fuTNQAj1Zq4oTFi9Yjp3wzElcxg==" + }, + "node_modules/@radix-ui/number": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@radix-ui/number/-/number-1.1.0.tgz", + "integrity": "sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==" + }, + "node_modules/@radix-ui/primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@radix-ui/primitive/-/primitive-1.1.0.tgz", + "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==" + }, + "node_modules/@radix-ui/react-accessible-icon": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-accessible-icon/-/react-accessible-icon-1.1.0.tgz", + "integrity": "sha512-i9Zg4NOSXlfUva0agzI2DjWrvFJm9uO4L6CMW7nmMa5CIOOX/Yin894W7WwjodFQWPwe5kmAJ4JF33R8slKI2g==", + "dependencies": { + "@radix-ui/react-visually-hidden": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-alert-dialog": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-alert-dialog/-/react-alert-dialog-1.1.1.tgz", + "integrity": "sha512-wmCoJwj7byuVuiLKqDLlX7ClSUU0vd9sdCeM+2Ls+uf13+cpSJoMgwysHq1SGVVkJj5Xn0XWi1NoRCdkMpr6Mw==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-dialog": "1.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-arrow": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-arrow/-/react-arrow-1.1.0.tgz", + "integrity": "sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-aspect-ratio": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-aspect-ratio/-/react-aspect-ratio-1.1.0.tgz", + "integrity": "sha512-dP87DM/Y7jFlPgUZTlhx6FF5CEzOiaxp2rBCKlaXlpH5Ip/9Fg5zZ9lDOQ5o/MOfUlf36eak14zoWYpgcgGoOg==", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-avatar": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-avatar/-/react-avatar-1.1.0.tgz", + "integrity": "sha512-Q/PbuSMk/vyAd/UoIShVGZ7StHHeRFYU7wXmi5GV+8cLXflZAEpHL/F697H1klrzxKXNtZ97vWiC0q3RKUH8UA==", + "dependencies": { + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-checkbox": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-checkbox/-/react-checkbox-1.1.0.tgz", + "integrity": "sha512-3+kSzVfMONtP3B6CvaOrXLVTyGYws7tGmG5kOY0AfyH9sexkLytIwciNwjZhY0RoGOEbxI7bMS21XYB8H5itWQ==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-use-size": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collapsible": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-collapsible/-/react-collapsible-1.1.0.tgz", + "integrity": "sha512-zQY7Epa8sTL0mq4ajSJpjgn2YmCgyrG7RsQgLp3C0LQVkG7+Tf6Pv1CeNWZLyqMjhdPkBa5Lx7wYBeSu7uCSTA==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-collection": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-collection/-/react-collection-1.1.0.tgz", + "integrity": "sha512-GZsZslMJEyo1VKm5L1ZJY8tGDxZNPAoUeQUIbKeJfoi7Q4kmig5AsgLMYYuyYbfjd8fBmFORAIwYAkXMnXZgZw==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", + "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-context/-/react-context-1.1.0.tgz", + "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-context-menu": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-context-menu/-/react-context-menu-2.2.1.tgz", + "integrity": "sha512-wvMKKIeb3eOrkJ96s722vcidZ+2ZNfcYZWBPRHIB1VWrF+fiF851Io6LX0kmK5wTDQFKdulCCKJk2c3SBaQHvA==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-menu": "2.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dialog": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-dialog/-/react-dialog-1.1.1.tgz", + "integrity": "sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-focus-guards": "1.1.0", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.7" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-direction/-/react-direction-1.1.0.tgz", + "integrity": "sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dismissable-layer": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.0.tgz", + "integrity": "sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-escape-keydown": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-dropdown-menu": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.1.tgz", + "integrity": "sha512-y8E+x9fBq9qvteD2Zwa4397pUVhYsh9iq44b5RD5qu1GMJWBCBuVg1hMyItbc6+zH00TxGRqd9Iot4wzf3OoBQ==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-menu": "2.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-guards": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.0.tgz", + "integrity": "sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-focus-scope": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.0.tgz", + "integrity": "sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-form": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-form/-/react-form-0.1.0.tgz", + "integrity": "sha512-1/oVYPDjbFILOLIarcGcMKo+y6SbTVT/iUKVEw59CF4offwZgBgC3ZOeSBewjqU0vdA6FWTPWTN63obj55S/tQ==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-label": "2.1.0", + "@radix-ui/react-primitive": "2.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-hover-card": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-hover-card/-/react-hover-card-1.1.1.tgz", + "integrity": "sha512-IwzAOP97hQpDADYVKrEEHUH/b2LA+9MgB0LgdmnbFO2u/3M5hmEofjjr2M6CyzUblaAqJdFm6B7oFtU72DPXrA==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-id": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-id/-/react-id-1.1.0.tgz", + "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-label": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-label/-/react-label-2.1.0.tgz", + "integrity": "sha512-peLblDlFw/ngk3UWq0VnYaOLy6agTZZ+MUO/WhVfm14vJGML+xH4FAl2XQGLqdefjNb7ApRg6Yn7U42ZhmYXdw==", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-menu": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-menu/-/react-menu-2.1.1.tgz", + "integrity": "sha512-oa3mXRRVjHi6DZu/ghuzdylyjaMXLymx83irM7hTxutQbD+7IhPKdMdRHD26Rm+kHRrWcrUkkRPv5pd47a2xFQ==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-focus-guards": "1.1.0", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-roving-focus": "1.1.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.7" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-navigation-menu": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.0.tgz", + "integrity": "sha512-OQ8tcwAOR0DhPlSY3e4VMXeHiol7la4PPdJWhhwJiJA+NLX0SaCaonOkRnI3gCDHoZ7Fo7bb/G6q25fRM2Y+3Q==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-visually-hidden": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popover": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-popover/-/react-popover-1.1.1.tgz", + "integrity": "sha512-3y1A3isulwnWhvTTwmIreiB8CF4L+qRjZnK1wYLO7pplddzXKby/GnZ2M7OZY3qgnl6p9AodUIHRYGXNah8Y7g==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-focus-guards": "1.1.0", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.7" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-popper": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-popper/-/react-popper-1.2.0.tgz", + "integrity": "sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==", + "dependencies": { + "@floating-ui/react-dom": "^2.0.0", + "@radix-ui/react-arrow": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-use-rect": "1.1.0", + "@radix-ui/react-use-size": "1.1.0", + "@radix-ui/rect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-portal/-/react-portal-1.1.1.tgz", + "integrity": "sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-presence/-/react-presence-1.1.0.tgz", + "integrity": "sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", + "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", + "dependencies": { + "@radix-ui/react-slot": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-progress": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-progress/-/react-progress-1.1.0.tgz", + "integrity": "sha512-aSzvnYpP725CROcxAOEBVZZSIQVQdHgBr2QQFKySsaD14u8dNT0batuXI+AAGDdAHfXH8rbnHmjYFqVJ21KkRg==", + "dependencies": { + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-radio-group": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-radio-group/-/react-radio-group-1.2.0.tgz", + "integrity": "sha512-yv+oiLaicYMBpqgfpSPw6q+RyXlLdIpQWDHZbUKURxe+nEh53hFXPPlfhfQQtYkS5MMK/5IWIa76SksleQZSzw==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-roving-focus": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-use-size": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-roving-focus": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-roving-focus/-/react-roving-focus-1.1.0.tgz", + "integrity": "sha512-EA6AMGeq9AEeQDeSH0aZgG198qkfHSbvWTf1HvoDmOB5bBG/qTxjYMWUKMnYiV6J/iP/J8MEFSuB2zRU2n7ODA==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-scroll-area": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-scroll-area/-/react-scroll-area-1.1.0.tgz", + "integrity": "sha512-9ArIZ9HWhsrfqS765h+GZuLoxaRHD/j0ZWOWilsCvYTpYJp8XwCqNG7Dt9Nu/TItKOdgLGkOPCodQvDc+UMwYg==", + "dependencies": { + "@radix-ui/number": "1.1.0", + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-select": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-select/-/react-select-2.1.1.tgz", + "integrity": "sha512-8iRDfyLtzxlprOo9IicnzvpsO1wNCkuwzzCM+Z5Rb5tNOpCdMvcc2AkzX0Fz+Tz9v6NJ5B/7EEgyZveo4FBRfQ==", + "dependencies": { + "@radix-ui/number": "1.1.0", + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-focus-guards": "1.1.0", + "@radix-ui/react-focus-scope": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-visually-hidden": "1.1.0", + "aria-hidden": "^1.1.1", + "react-remove-scroll": "2.5.7" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slider": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-slider/-/react-slider-1.2.0.tgz", + "integrity": "sha512-dAHCDA4/ySXROEPaRtaMV5WHL8+JB/DbtyTbJjYkY0RXmKMO2Ln8DFZhywG5/mVQ4WqHDBc8smc14yPXPqZHYA==", + "dependencies": { + "@radix-ui/number": "1.1.0", + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-use-size": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", + "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", + "dependencies": { + "@radix-ui/react-compose-refs": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-switch": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-switch/-/react-switch-1.1.0.tgz", + "integrity": "sha512-OBzy5WAj641k0AOSpKQtreDMe+isX0MQJ1IVyF03ucdF3DunOnROVrjWs8zsXUxC3zfZ6JL9HFVCUlMghz9dJw==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-previous": "1.1.0", + "@radix-ui/react-use-size": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-tabs": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-tabs/-/react-tabs-1.1.0.tgz", + "integrity": "sha512-bZgOKB/LtZIij75FSuPzyEti/XBhJH52ExgtdVqjCIh+Nx/FW+LhnbXtbCzIi34ccyMsyOja8T0thCzoHFXNKA==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-roving-focus": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toast": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-toast/-/react-toast-1.2.1.tgz", + "integrity": "sha512-5trl7piMXcZiCq7MW6r8YYmu0bK5qDpTWz+FdEPdKyft2UixkspheYbjbrLXVN5NGKHFbOP7lm8eD0biiSqZqg==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-collection": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-use-layout-effect": "1.1.0", + "@radix-ui/react-visually-hidden": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-toggle/-/react-toggle-1.1.0.tgz", + "integrity": "sha512-gwoxaKZ0oJ4vIgzsfESBuSgJNdc0rv12VhHgcqN0TEJmmZixXG/2XpsLK8kzNWYcnaoRIEEQc0bEi3dIvdUpjw==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-toggle-group": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-toggle-group/-/react-toggle-group-1.1.0.tgz", + "integrity": "sha512-PpTJV68dZU2oqqgq75Uzto5o/XfOVgkrJ9rulVmfTKxWp3HfUjHE6CP/WLRR4AzPX9HWxw7vFow2me85Yu+Naw==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-roving-focus": "1.1.0", + "@radix-ui/react-toggle": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", + "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-controllable-state": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", + "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-escape-keydown": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz", + "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==", + "dependencies": { + "@radix-ui/react-use-callback-ref": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", + "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-previous": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-previous/-/react-use-previous-1.1.0.tgz", + "integrity": "sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==", + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-rect": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-rect/-/react-use-rect-1.1.0.tgz", + "integrity": "sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==", + "dependencies": { + "@radix-ui/rect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-use-size": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-use-size/-/react-use-size-1.1.0.tgz", + "integrity": "sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==", + "dependencies": { + "@radix-ui/react-use-layout-effect": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-visually-hidden": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-visually-hidden/-/react-visually-hidden-1.1.0.tgz", + "integrity": "sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==", + "dependencies": { + "@radix-ui/react-primitive": "2.0.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/rect": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@radix-ui/rect/-/rect-1.1.0.tgz", + "integrity": "sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==" + }, + "node_modules/@radix-ui/themes": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/@radix-ui/themes/-/themes-3.1.1.tgz", + "integrity": "sha512-G+j+x+7kyqQXnn+ftlNPgk1DdZ8h/vVZnLsG4hZB0Mxw4fdKCh1tThQuXDSBNWhFt/vTG79BMzRMiflovENrmA==", + "dependencies": { + "@radix-ui/colors": "3.0.0", + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-accessible-icon": "1.1.0", + "@radix-ui/react-alert-dialog": "1.1.1", + "@radix-ui/react-aspect-ratio": "1.1.0", + "@radix-ui/react-avatar": "1.1.0", + "@radix-ui/react-checkbox": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-context-menu": "2.2.1", + "@radix-ui/react-dialog": "1.1.1", + "@radix-ui/react-direction": "1.1.0", + "@radix-ui/react-dropdown-menu": "2.1.1", + "@radix-ui/react-form": "0.1.0", + "@radix-ui/react-hover-card": "1.1.1", + "@radix-ui/react-navigation-menu": "1.2.0", + "@radix-ui/react-popover": "1.1.1", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-progress": "1.1.0", + "@radix-ui/react-radio-group": "1.2.0", + "@radix-ui/react-roving-focus": "1.1.0", + "@radix-ui/react-scroll-area": "1.1.0", + "@radix-ui/react-select": "2.1.1", + "@radix-ui/react-slider": "1.2.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-switch": "1.1.0", + "@radix-ui/react-tabs": "1.1.0", + "@radix-ui/react-toggle-group": "1.1.0", + "@radix-ui/react-tooltip": "1.1.1", + "@radix-ui/react-use-callback-ref": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-visually-hidden": "1.1.0", + "classnames": "2.3.2", + "react-remove-scroll-bar": "2.3.4" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/themes/node_modules/@radix-ui/react-tooltip": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/@radix-ui/react-tooltip/-/react-tooltip-1.1.1.tgz", + "integrity": "sha512-LLE8nzNE4MzPMw3O2zlVlkLFid3y9hMUs7uCbSHyKSo+tCN4yMCf+ZCCcfrYgsOC0TiHBPQ1mtpJ2liY3ZT3SQ==", + "dependencies": { + "@radix-ui/primitive": "1.1.0", + "@radix-ui/react-compose-refs": "1.1.0", + "@radix-ui/react-context": "1.1.0", + "@radix-ui/react-dismissable-layer": "1.1.0", + "@radix-ui/react-id": "1.1.0", + "@radix-ui/react-popper": "1.2.0", + "@radix-ui/react-portal": "1.1.1", + "@radix-ui/react-presence": "1.1.0", + "@radix-ui/react-primitive": "2.0.0", + "@radix-ui/react-slot": "1.1.0", + "@radix-ui/react-use-controllable-state": "1.1.0", + "@radix-ui/react-visually-hidden": "1.1.0" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/themes/node_modules/classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + }, + "node_modules/@react-aria/focus": { + "version": "3.18.1", + "resolved": "https://registry.npmmirror.com/@react-aria/focus/-/focus-3.18.1.tgz", + "integrity": "sha512-N0Cy61WCIv+57mbqC7hiZAsB+3rF5n4JKabxUmg/2RTJL6lq7hJ5N4gx75ymKxkN8GnVDwt4pKZah48Wopa5jw==", + "dependencies": { + "@react-aria/interactions": "^3.22.1", + "@react-aria/utils": "^3.25.1", + "@react-types/shared": "^3.24.1", + "@swc/helpers": "^0.5.0", + "clsx": "^2.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@react-aria/interactions": { + "version": "3.22.1", + "resolved": "https://registry.npmmirror.com/@react-aria/interactions/-/interactions-3.22.1.tgz", + "integrity": "sha512-5TLzQaDAQQ5C70yG8GInbO4wIylKY67RfTIIwQPGR/4n5OIjbUD8BOj3NuSsuZ/frUPaBXo1VEBBmSO23fxkjw==", + "dependencies": { + "@react-aria/ssr": "^3.9.5", + "@react-aria/utils": "^3.25.1", + "@react-types/shared": "^3.24.1", + "@swc/helpers": "^0.5.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@react-aria/ssr": { + "version": "3.9.5", + "resolved": "https://registry.npmmirror.com/@react-aria/ssr/-/ssr-3.9.5.tgz", + "integrity": "sha512-xEwGKoysu+oXulibNUSkXf8itW0npHHTa6c4AyYeZIJyRoegeteYuFpZUBPtIDE8RfHdNsSmE1ssOkxRnwbkuQ==", + "dependencies": { + "@swc/helpers": "^0.5.0" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@react-aria/utils": { + "version": "3.25.1", + "resolved": "https://registry.npmmirror.com/@react-aria/utils/-/utils-3.25.1.tgz", + "integrity": "sha512-5Uj864e7T5+yj78ZfLnfHqmypLiqW2mN+nsdslog2z5ssunTqjolVeM15ootXskjISlZ7MojLpq97kIC4nlnAw==", + "dependencies": { + "@react-aria/ssr": "^3.9.5", + "@react-stately/utils": "^3.10.2", + "@react-types/shared": "^3.24.1", + "@swc/helpers": "^0.5.0", + "clsx": "^2.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@react-stately/utils": { + "version": "3.10.2", + "resolved": "https://registry.npmmirror.com/@react-stately/utils/-/utils-3.10.2.tgz", + "integrity": "sha512-fh6OTQtbeQC0ywp6LJuuKs6tKIgFvt/DlIZEcIpGho6/oZG229UnIk6TUekwxnDbumuYyan6D9EgUtEMmT8UIg==", + "dependencies": { + "@swc/helpers": "^0.5.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@react-types/shared": { + "version": "3.24.1", + "resolved": "https://registry.npmmirror.com/@react-types/shared/-/shared-3.24.1.tgz", + "integrity": "sha512-AUQeGYEm/zDTN6zLzdXolDxz3Jk5dDL7f506F07U8tBwxNNI3WRdhU84G0/AaFikOZzDXhOZDr3MhQMzyE7Ydw==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.3.tgz", + "integrity": "sha512-qC/xYId4NMebE6w/V33Fh9gWxLgURiNYgVNObbJl2LZv0GUUItCcCqC5axQSwRaAgaxl2mELq1rMzlswaQ0Zxg==", + "dev": true + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" + }, + "node_modules/@swc/helpers": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", + "dependencies": { + "@swc/counter": "^0.1.3", + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/forms": { + "version": "0.5.7", + "resolved": "https://registry.npmmirror.com/@tailwindcss/forms/-/forms-0.5.7.tgz", + "integrity": "sha512-QE7X69iQI+ZXwldE+rzasvbJiyV/ju1FGHH0Qn2W3FKbuYtqp8LKcy6iSw79fVUT5/Vvf+0XgLCeYVG+UV6hOw==", + "dev": true, + "dependencies": { + "mini-svg-data-uri": "^1.2.3" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || >= 3.0.0-alpha.1" + } + }, + "node_modules/@tanstack/react-virtual": { + "version": "3.8.4", + "resolved": "https://registry.npmmirror.com/@tanstack/react-virtual/-/react-virtual-3.8.4.tgz", + "integrity": "sha512-Dq0VQr3QlTS2qL35g360QaJWBt7tCn/0xw4uZ0dHXPLO1Ak4Z4nVX4vuj1Npg1b/jqNMDToRtR5OIxM2NXRBWg==", + "dependencies": { + "@tanstack/virtual-core": "3.8.4" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@tanstack/virtual-core": { + "version": "3.8.4", + "resolved": "https://registry.npmmirror.com/@tanstack/virtual-core/-/virtual-core-3.8.4.tgz", + "integrity": "sha512-iO5Ujgw3O1yIxWDe9FgUPNkGjyT657b1WNX52u+Wv1DyBFEpdCdGkuVaky0M3hHFqNWjAmHWTn4wgj9rTr7ZQg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.14.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.10.tgz", + "integrity": "sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", + "devOptional": true + }, + "node_modules/@types/react": { + "version": "18.3.3", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", + "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", + "devOptional": true, + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", + "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", + "devOptional": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.2.0.tgz", + "integrity": "sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "7.2.0", + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/typescript-estree": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz", + "integrity": "sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", + "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", + "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", + "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.2.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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==", + "devOptional": 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/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/aria-hidden": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/aria-hidden/-/aria-hidden-1.2.4.tgz", + "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.toreversed": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", + "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.9.1.tgz", + "integrity": "sha512-QbUdXJVTpvUTHU7871ppZkdOLBeGUKBQWHkHrvN2V9IQWGMt61zf3B45BtzjxEJzYuj0JBjBZP/hmYS/R9pmAw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", + "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", + "dev": true, + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "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==", + "devOptional": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "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==", + "devOptional": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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.30001641", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001641.tgz", + "integrity": "sha512-Phv5thgl67bHYo1TtMY/MurjkHhV4EDaCosezRXgZ8jzA/Ub+wjxAvbGvjoFENStinwi5kCyOYV3mi5tOGykwA==", + "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/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "devOptional": 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==", + "devOptional": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmmirror.com/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-selector-tokenizer": { + "version": "0.8.0", + "resolved": "https://registry.npmmirror.com/css-selector-tokenizer/-/css-selector-tokenizer-0.8.0.tgz", + "integrity": "sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "fastparse": "^1.1.2" + } + }, + "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.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "devOptional": true + }, + "node_modules/culori": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/culori/-/culori-3.3.0.tgz", + "integrity": "sha512-pHJg+jbuFsCjz9iclQBqyL3B2HLCBF71BwVNujUYEvCeQMvV97R59MNK3R2+jgJ3a1fcZgI9B3vYgz8lzr/BFQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/daisyui": { + "version": "4.12.10", + "resolved": "https://registry.npmmirror.com/daisyui/-/daisyui-4.12.10.tgz", + "integrity": "sha512-jp1RAuzbHhGdXmn957Z2XsTZStXGHzFfF0FgIOZj3Wv9sH7OZgLfXTRZNfKVYxltGUOBsG1kbWAdF5SrqjebvA==", + "dev": true, + "dependencies": { + "css-selector-tokenizer": "^0.8", + "culori": "^3", + "picocolors": "^1", + "postcss-js": "^4" + }, + "engines": { + "node": ">=16.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/daisyui" + } + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true + }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-uri-component": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/decode-uri-component/-/decode-uri-component-0.4.1.tgz", + "integrity": "sha512-+8VxcR21HhTy8nOt6jf20w0c9CADrw1O8d+VZ/YzzCt4bJ3uBjw+D1q2osAB8RnpwwaeYBxy0HyKQxD5JBMuuQ==", + "engines": { + "node": ">=14.16" + } + }, + "node_modules/deep-equal": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" + }, + "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/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/enhanced-resolve": { + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", + "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-abstract": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", + "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-next": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.5.tgz", + "integrity": "sha512-zogs9zlOiZ7ka+wgUnmcM0KBEDjo4Jis7kxN1jvC0N4wynQ2MIx/KBkg4mVF63J5EK4W0QMCn7xO3vNisjaAoA==", + "dev": true, + "dependencies": { + "@next/eslint-plugin-next": "14.2.5", + "@rushstack/eslint-patch": "^1.3.3", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || 7.0.0 - 7.2.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" + }, + "peerDependencies": { + "eslint": "^7.23.0 || ^8.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", + "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "enhanced-resolve": "^5.12.0", + "eslint-module-utils": "^2.7.4", + "fast-glob": "^3.3.1", + "get-tsconfig": "^4.5.0", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/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/eslint-plugin-jsx-a11y": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.9.0.tgz", + "integrity": "sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g==", + "dev": true, + "dependencies": { + "aria-query": "~5.1.3", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.9.1", + "axobject-query": "~3.1.1", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "es-iterator-helpers": "^1.0.19", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.0" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.34.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.3.tgz", + "integrity": "sha512-aoW4MV891jkUulwDApQbPYTVZmeuSyFrudpbTAQuj5Fv8VL+o6df2xIGpw8B0hPjAaih1/Fb0om9grCdyFYemA==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.toreversed": "^1.1.2", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.19", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.hasown": "^1.1.4", + "object.values": "^1.2.0", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.11" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/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/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "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.4" + }, + "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/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "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==", + "devOptional": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/filter-obj": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/filter-obj/-/filter-obj-5.1.0.tgz", + "integrity": "sha512-qWeTREPoT7I0bifpPUXtxkZJ1XJzxWtfoWWkdVGqa+eCr3SHW/Ocp89o8vLvbUuQnadybJpjOKu4V+RwO6sGng==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/foreground-child": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", + "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/framer-motion": { + "version": "11.3.28", + "resolved": "https://registry.npmmirror.com/framer-motion/-/framer-motion-11.3.28.tgz", + "integrity": "sha512-dqhoawipEAjqdv32zbv72sOMJZjol7dROWn7t/FOq23WXJ40O4OUybgnO2ldnuS+3YquSn8xO/KKRavZ+TBVOQ==", + "dependencies": { + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": 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/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.5.tgz", + "integrity": "sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/immutable": { + "version": "4.3.7", + "resolved": "https://registry.npmmirror.com/immutable/-/immutable-4.3.7.tgz", + "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", + "devOptional": true + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/intl-messageformat": { + "version": "10.5.14", + "resolved": "https://registry.npmmirror.com/intl-messageformat/-/intl-messageformat-10.5.14.tgz", + "integrity": "sha512-IjC6sI0X7YRjjyVH9aUgdftcmZK7WXdHeil4KwbjDnRWjnVitKpAx3rr6t6di1joFp5188VqKcobOPA6mCLG/w==", + "dependencies": { + "@formatjs/ecma402-abstract": "2.0.0", + "@formatjs/fast-memoize": "2.2.0", + "@formatjs/icu-messageformat-parser": "2.7.8", + "tslib": "^2.4.0" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmmirror.com/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "devOptional": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", + "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", + "dev": true, + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "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==", + "devOptional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "devOptional": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "devOptional": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "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/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "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/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "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": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "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.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mini-svg-data-uri": { + "version": "1.4.4", + "resolved": "https://registry.npmmirror.com/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz", + "integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==", + "dev": true, + "bin": { + "mini-svg-data-uri": "cli.js" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "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.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "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/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/next": { + "version": "14.2.5", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.5.tgz", + "integrity": "sha512-0f8aRfBVL+mpzfBjYfQuLWh2WyAwtJXCRfkPF4UJ5qd2YwrHczsrSzXU4tRMV0OAxR8ZJZWPFn6uhSC56UTsLA==", + "dependencies": { + "@next/env": "14.2.5", + "@swc/helpers": "0.5.5", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=18.17.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "14.2.5", + "@next/swc-darwin-x64": "14.2.5", + "@next/swc-linux-arm64-gnu": "14.2.5", + "@next/swc-linux-arm64-musl": "14.2.5", + "@next/swc-linux-x64-gnu": "14.2.5", + "@next/swc-linux-x64-musl": "14.2.5", + "@next/swc-win32-arm64-msvc": "14.2.5", + "@next/swc-win32-ia32-msvc": "14.2.5", + "@next/swc-win32-x64-msvc": "14.2.5" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.41.2", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next-intl": { + "version": "3.19.0", + "resolved": "https://registry.npmmirror.com/next-intl/-/next-intl-3.19.0.tgz", + "integrity": "sha512-ciiHYBwR3ztoMdJZgFmt0LII7GYTsLA/MFt3y681q4Lw4fI5EYNCZSYb9XA/BIt3ZX5S1TLUP1uOERy1dIQvMg==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/amannn" + } + ], + "dependencies": { + "@formatjs/intl-localematcher": "^0.5.4", + "negotiator": "^0.6.3", + "use-intl": "^3.19.0" + }, + "peerDependencies": { + "next": "^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "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.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "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==", + "devOptional": 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/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.hasown": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz", + "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "devOptional": 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.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.4.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz", + "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==", + "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.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + }, + "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.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.1.tgz", + "integrity": "sha512-b4dlw/9V8A71rLIDsSwVmak9z2DuBUB7CA1/wSdelNEzqsjoSPeADTWNO09lpH49Diy3/JIZ2bSPB1dI3LJCHg==", + "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/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/query-string": { + "version": "9.1.0", + "resolved": "https://registry.npmmirror.com/query-string/-/query-string-9.1.0.tgz", + "integrity": "sha512-t6dqMECpCkqfyv2FfwVS1xcB6lgXW/0XZSaKdsCNGYkqMO76AFiJEg4vINzoDKcZa6MS7JX+OHIjwh06K5vczw==", + "dependencies": { + "decode-uri-component": "^0.4.1", + "filter-obj": "^5.1.0", + "split-on-first": "^3.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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-icons": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/react-icons/-/react-icons-5.2.1.tgz", + "integrity": "sha512-zdbW5GstTzXaVKvGSyTaBalt7HSfuK5ovrzlpyiWHAFXndXTdd/1hdDHI4xBM1Mn7YriT6aqESucFl9kEXzrdw==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "node_modules/react-remove-scroll": { + "version": "2.5.7", + "resolved": "https://registry.npmmirror.com/react-remove-scroll/-/react-remove-scroll-2.5.7.tgz", + "integrity": "sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==", + "dependencies": { + "react-remove-scroll-bar": "^2.3.4", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.4", + "resolved": "https://registry.npmmirror.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz", + "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==", + "dependencies": { + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/react-style-singleton/-/react-style-singleton-2.2.1.tgz", + "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", + "dependencies": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "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==", + "devOptional": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", + "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sass": { + "version": "1.77.8", + "resolved": "https://registry.npmmirror.com/sass/-/sass-1.77.8.tgz", + "integrity": "sha512-4UHg6prsrycW20fqLGPShtEvo/WyHRVRHwOP4DzkUrObWoWI05QBSfzU71TVB7PFaL104TwNaHpjlWXAZbQiNQ==", + "devOptional": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "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": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-on-first": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/split-on-first/-/split-on-first-3.0.0.tgz", + "integrity": "sha512-qxQJTx2ryR0Dw0ITYyekNQWpz6f8dGd7vffGNflQQ3Iqj9NJ6qiZ7ELpZsJ/QBhIVAiDfXdag3+Gp8RvWa62AA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dev": true, + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/string.prototype.includes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.0.tgz", + "integrity": "sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", + "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==" + }, + "node_modules/tailwindcss": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.4.tgz", + "integrity": "sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.0", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "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/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==", + "devOptional": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.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/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", + "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/use-callback-ref/-/use-callback-ref-1.3.2.tgz", + "integrity": "sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-intl": { + "version": "3.19.0", + "resolved": "https://registry.npmmirror.com/use-intl/-/use-intl-3.19.0.tgz", + "integrity": "sha512-JOA73+YdtArxkvFKrneLAhH55m+x+sA9Wj8w8rYkHkHvcW/76w5T3szSmBG063vH3UqLoIKlsDVBBUfpkB7GMg==", + "dependencies": { + "@formatjs/fast-memoize": "^2.2.0", + "intl-messageformat": "^10.5.14" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/use-sidecar": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/use-sidecar/-/use-sidecar-1.1.2.tgz", + "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sync-external-store": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", + "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.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/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dev": true, + "dependencies": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/yaml": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz", + "integrity": "sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==", + "dev": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zustand": { + "version": "4.5.5", + "resolved": "https://registry.npmmirror.com/zustand/-/zustand-4.5.5.tgz", + "integrity": "sha512-+0PALYNJNgK6hldkgDq2vLrw5f6g/jCInz52n9RTpropGgeAf/ioFUCdtsjCqu4gNhW9D01rUQBROoRjdzyn2Q==", + "dependencies": { + "use-sync-external-store": "1.2.2" + }, + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "@types/react": ">=16.8", + "immer": ">=9.0.6", + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + } + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..13c5d02 --- /dev/null +++ b/package.json @@ -0,0 +1,41 @@ +{ + "name": "typeframes-ai", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start -p 12680", + "lint": "next lint" + }, + "dependencies": { + "@headlessui/react": "^2.1.2", + "@radix-ui/react-collapsible": "^1.1.0", + "@radix-ui/react-dialog": "^1.1.1", + "@radix-ui/react-tabs": "^1.1.0", + "@radix-ui/react-toast": "^1.2.1", + "@radix-ui/themes": "^3.1.1", + "classnames": "^2.5.1", + "framer-motion": "^11.3.28", + "next": "14.2.5", + "next-intl": "^3.19.0", + "query-string": "^9.1.0", + "react": "^18", + "react-dom": "^18", + "react-icons": "^5.2.1", + "zustand": "^4.5.5" + }, + "devDependencies": { + "@tailwindcss/forms": "^0.5.7", + "@types/node": "^20", + "@types/react": "^18", + "@types/react-dom": "^18", + "daisyui": "^4.12.10", + "eslint": "^8", + "eslint-config-next": "14.2.5", + "postcss": "^8", + "sass": "^1.77.8", + "tailwindcss": "^3.4.1", + "typescript": "^5" + } +} diff --git a/postcss.config.mjs b/postcss.config.mjs new file mode 100644 index 0000000..1a69fd2 --- /dev/null +++ b/postcss.config.mjs @@ -0,0 +1,8 @@ +/** @type {import('postcss-load-config').Config} */ +const config = { + plugins: { + tailwindcss: {}, + }, +}; + +export default config; diff --git a/src/apis/auth.ts b/src/apis/auth.ts new file mode 100644 index 0000000..043807b --- /dev/null +++ b/src/apis/auth.ts @@ -0,0 +1,21 @@ +// import 'server-only'; + +import request from '@/utils/request'; + + +export const GetUserInfo = (params?: Record) => { + return request.get('/profile/', { + params, + cacheTime: 0, + }); +}; + +export const GetSpeakersData = () => { + return request.get('/get_speakers/'); +} +export const GetVideoList = () => { + return request.get('/video-list/'); +} +export const GetMetadata = () => { + return request.get('/website/'); +} \ No newline at end of file diff --git a/src/app/(console)/create/page.tsx b/src/app/(console)/create/page.tsx new file mode 100644 index 0000000..7dea6ab --- /dev/null +++ b/src/app/(console)/create/page.tsx @@ -0,0 +1,24 @@ +import { useTranslations } from "next-intl"; +import CreateTabs from "@/ui/(console)/create/create-tabs"; + +export default function Page() { + const t = useTranslations("createPage"); + + return ( +
+
+
+
+
+
{t("createNewVideo")}
+
+

+ {t("selectStyleOrTemplate")} +

+
+ +
+
+
+ ); +} diff --git a/src/app/(console)/home/page.tsx b/src/app/(console)/home/page.tsx new file mode 100644 index 0000000..96b2056 --- /dev/null +++ b/src/app/(console)/home/page.tsx @@ -0,0 +1,3 @@ +export default function Page() { + return <>123; +} diff --git a/src/app/(console)/layout.tsx b/src/app/(console)/layout.tsx new file mode 100644 index 0000000..b542b26 --- /dev/null +++ b/src/app/(console)/layout.tsx @@ -0,0 +1,23 @@ +import SideBar from "@/ui/(console)/side-bar"; +import { Metadata } from "next"; +import GlobalLoading from "@/components/GlobalLoading"; +import UserInfo from "@/components/logics/UserInfo"; + +export default async function ConsoleLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + <> +
+ {/* }> */} + + {children} + + {/* */} +
+ + + ); +} diff --git a/src/app/(console)/loading.tsx b/src/app/(console)/loading.tsx new file mode 100644 index 0000000..606baad --- /dev/null +++ b/src/app/(console)/loading.tsx @@ -0,0 +1,14 @@ +import { useTranslations } from "next-intl"; + +export default function Loading() { + const t = useTranslations("loading"); + + return ( +
+
+ + {t("preparing")} +
+
+ ); +} diff --git a/src/app/(console)/projects/page.tsx b/src/app/(console)/projects/page.tsx new file mode 100644 index 0000000..30f10cd --- /dev/null +++ b/src/app/(console)/projects/page.tsx @@ -0,0 +1,129 @@ +"use client"; +import useFetch from "@/hooks/useFetch"; +import { useEffect, useState, useRef } from "react"; +import { FaPlus } from "react-icons/fa6"; +import VideoItem from "@/ui/(console)/projects/video-item"; +import { useRouter } from "next/navigation"; +import Loading from "@/components/Loading"; +import { useTranslations } from "next-intl"; +import { list } from "postcss"; + +export default function Page() { + const t = useTranslations("project"); + const router = useRouter(); + const [page, setPage] = useState(1); + const [videos, setVideos] = useState([]); + const [hasMore, setHasMore] = useState(true); + const [loadingMore, setLoadingMore] = useState(false); + const observerRef = useRef(null); // 用于观察的元素 + const { + data: videoData, + loading, + fetchData: fetchVideoList, + } = useFetch({ + url: `/api/video-list/?page=${page}&page_size=10`, + method: "GET", + cacheTime: 0, + }); + + // 获取视频列表 + useEffect(() => { + if (page === 1) { + fetchVideoList().then((res) => { + setVideos(res.list || []); + setHasMore(res.page < res.total_pages); // 检查是否还有更多页面 + }); + } else if (!loadingMore) { + setLoadingMore(true); + fetchVideoList().then((res) => { + setVideos((prevVideos) => [...prevVideos, ...(res.list || [])]); + setHasMore(res.page < res.total_pages); + setLoadingMore(false); + }); + } + }, [page]); + + // 触底加载更多 + useEffect(() => { + const observer = new IntersectionObserver( + (entries) => { + if (entries[0].isIntersecting && hasMore && !loadingMore) { + setPage((prevPage) => prevPage + 1); + } + }, + { threshold: 1 } + ); + + if (observerRef.current) { + observer.observe(observerRef.current); + } + + return () => { + if (observerRef.current) observer.unobserve(observerRef.current); + }; + }, [hasMore, loadingMore]); + + // 没有滚动条时继续加载 + useEffect(() => { + const handleNoScrollBar = () => { + if ( + document.documentElement.scrollHeight <= + document.documentElement.clientHeight && + hasMore + ) { + setPage((prevPage) => prevPage + 1); + } + }; + + handleNoScrollBar(); // 初始化时检查 + + window.addEventListener("resize", handleNoScrollBar); // 窗口大小变化时检查 + + return () => { + window.removeEventListener("resize", handleNoScrollBar); + }; + }, [hasMore]); + + return ( +
+
+
+
+
+
+ {t("yourVideos")} +
+
+ +
+
+
+ {videos.length > 0 ? ( + videos.map((item, index) => ( + + )) + ) : ( + <> + )} +
+ {loadingMore && }{" "} + {/* 加载更多时显示加载中 */} +
{" "} + {/* 观察触底的元素 */} +
+
+
+
+ ); +} diff --git a/src/app/(console)/queue/page.tsx b/src/app/(console)/queue/page.tsx new file mode 100644 index 0000000..e651fde --- /dev/null +++ b/src/app/(console)/queue/page.tsx @@ -0,0 +1,3 @@ +export default function Page() { + return
queue
; +} diff --git a/src/app/(main)/layout.tsx b/src/app/(main)/layout.tsx new file mode 100644 index 0000000..f0a153a --- /dev/null +++ b/src/app/(main)/layout.tsx @@ -0,0 +1,24 @@ +import PageHeader from "@/ui/page/page-header"; +import PageFooter from "@/ui/page/page-footer"; +import GlobalLoading from "@/components/GlobalLoading"; +export default function MainLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + <> +
+ +
+ {children} +
+ +
+ + + ); +} diff --git a/src/app/(main)/page.tsx b/src/app/(main)/page.tsx new file mode 100644 index 0000000..bb137ac --- /dev/null +++ b/src/app/(main)/page.tsx @@ -0,0 +1,20 @@ +import PageIntro from "@/ui/page/page-intro"; +import PageStatis from "@/ui/page/page-statis"; +import PageTeach from "@/ui/page/page-Teach"; +import PageExpect from "@/ui/page/page-expect"; +import PageTools from "@/ui/page/page-tools"; +import PageFaqs from "@/ui/page/page-faqs"; +import PageRemark from "@/ui/page/page-remark"; +export default function Home() { + return ( + <> + + + {/* */} + + {/* */} + {/* */} + + + ); +} diff --git a/src/app/(main)/pricing/page.tsx b/src/app/(main)/pricing/page.tsx new file mode 100644 index 0000000..cc8b676 --- /dev/null +++ b/src/app/(main)/pricing/page.tsx @@ -0,0 +1,247 @@ +"use client"; +import PaymentDialog from "@/components/PaymentDialog"; +import useFetch from "@/hooks/useFetch"; +import useLoadingStore from "@/store/loadingStore"; +import classNames from "classnames"; +import Link from "next/link"; +import { useEffect, useState } from "react"; +import { useTranslations } from "next-intl"; +export default function Page() { + const t = useTranslations("pricing"); // 使用翻译 + const { fetchData: GetPricing, data: pricingData } = useFetch({ + url: "/api/plans/", + method: "GET", + }); + useEffect(() => { + GetPricing().then((res) => { + console.log("pricing:", res); + }); + }, []); + const { + fetchData: createPayPalOrder, + loading: payPalLoading, + data: payPalData, + } = useFetch({ + url: "/api/paypal/create/", + method: "POST", + }); + const showLoading = useLoadingStore((state) => state.showLoading); + const hideLoading = useLoadingStore((state) => state.hideLoading); + const { + fetchData: createAlipayOrder, + loading: alipayLoading, + data: alipayData, + } = useFetch({ + url: "/api/alipay/create_order/", + method: "POST", + }); + + const { + fetchData: createAlipayH5Order, + loading: alipayH5Loading, + data: alipayH5Data, + } = useFetch({ + url: "/api/alipay/create_h5_order/", + method: "POST", + }); + + const [isDialogOpen, setDialogOpen] = useState(false); + const [selectedPlan, setSelectedPlan] = useState({ + id: null, + title: "", + price: null, + }); + + const openDialog = () => { + setDialogOpen(true); + }; + const handlePay = (platform) => { + const { id, title, price } = selectedPlan; + if (!id || !title || !price) return; + if (platform === "paypal") { + showLoading(); + createPayPalOrder({ plan_id: id, payment_method: "paypal" }) + .then((res) => { + console.log("paypal res:", res); + window.location.href = res.approval_url; + }) + .finally(() => { + hideLoading(); + }); + } else { + showLoading(); + createAlipayOrder({ id, title, price }) + .then((res) => { + console.log("Alipay res:", res); + window.location.href = res.alipay_url; + }) + .finally(() => { + hideLoading(); + }); + } + }; + return ( + <> +
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* SVG Icon here */} + {t("pricing")} +
+
+

+ {t("chooseYourPlan")} +

+ {/*

+ Get 2 months free when you pay yearly +

*/} +
+
+ {pricingData && + pricingData.map((plan, index) => ( +
+ {plan.is_promotional && ( + + {t("LaunchOffer")} + + )} +
+ {t(plan.title)} +
+
+
+ {`$${plan.price}`} +
+ {/* + /month + */} +
+
+
+
+ {/* SVG Icon here */} + {t("get")}{" "} + {plan.credits_per_month}{" "} + {t("points")} +
+
+ {t("FastVideoGeneration")} +
+
+ {t("RichVideoContent")} +
+
+
+
+ { + openDialog(); + setSelectedPlan({ + id: plan.id, + title: plan.title, + price: plan.price, + }); + }} + > + {t("SelectPlan")} + +
+
+
+
+ {t("agree")} + {/* + terms + */} +
+
+
+
+ ))} +
+
+

+ {t("SubscriptionsInclude")} +

+
+
+
+
+

+ {t("GenerateVideos")} +

+

+ {t("SaveMoney")} +

+
+ + {t("UsedByCreators")} + +
+
+ {/*
+
+
+
+
+ and 1,000+ others +
+
+
*/} +
+
+
+
+
+ + + ); +} diff --git a/src/app/(main)/terms/page.tsx b/src/app/(main)/terms/page.tsx new file mode 100644 index 0000000..0699cf8 --- /dev/null +++ b/src/app/(main)/terms/page.tsx @@ -0,0 +1,30 @@ +"use client"; + +import { useTranslations } from "next-intl"; +import useFetch from "@/hooks/useFetch"; +import { useEffect, useState } from "react"; + +export default function AgreementPage() { + const t = useTranslations("terms"); // 翻译使用 + + return ( +
+
+
+

+ {t("title")} {/* 用户协议的标题 */} +

+
+ + +
+ {/* 用户协议展示 */} +
+

{t("text")}

+
+
+ +
+
+ ); +} diff --git a/src/app/favicon.ico b/src/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..718d6fea4835ec2d246af9800eddb7ffb276240c GIT binary patch literal 25931 zcmeHv30#a{`}aL_*G&7qml|y<+KVaDM2m#dVr!KsA!#An?kSQM(q<_dDNCpjEux83 zLb9Z^XxbDl(w>%i@8hT6>)&Gu{h#Oeyszu?xtw#Zb1mO{pgX9699l+Qppw7jXaYf~-84xW z)w4x8?=youko|}Vr~(D$UXIbiXABHh`p1?nn8Po~fxRJv}|0e(BPs|G`(TT%kKVJAdg5*Z|x0leQq0 zkdUBvb#>9F()jo|T~kx@OM8$9wzs~t2l;K=woNssA3l6|sx2r3+kdfVW@e^8e*E}v zA1y5{bRi+3Z`uD3{F7LgFJDdvm;nJilkzDku>BwXH(8ItVCXk*-lSJnR?-2UN%hJ){&rlvg`CDTj z)Bzo!3v7Ou#83zEDEFcKt(f1E0~=rqeEbTnMvWR#{+9pg%7G8y>u1OVRUSoox-ovF z2Ydma(;=YuBY(eI|04{hXzZD6_f(v~H;C~y5=DhAC{MMS>2fm~1H_t2$56pc$NH8( z5bH|<)71dV-_oCHIrzrT`2s-5w_+2CM0$95I6X8p^r!gHp+j_gd;9O<1~CEQQGS8) zS9Qh3#p&JM-G8rHekNmKVewU;pJRcTAog68KYo^dRo}(M>36U4Us zfgYWSiHZL3;lpWT=zNAW>Dh#mB!_@Lg%$ms8N-;aPqMn+C2HqZgz&9~Eu z4|Kp<`$q)Uw1R?y(~S>ePdonHxpV1#eSP1B;Ogo+-Pk}6#0GsZZ5!||ev2MGdh}_m z{DeR7?0-1^zVs&`AV6Vt;r3`I`OI_wgs*w=eO%_#7Kepl{B@xiyCANc(l zzIyd4y|c6PXWq9-|KM8(zIk8LPk(>a)zyFWjhT!$HJ$qX1vo@d25W<fvZQ2zUz5WRc(UnFMKHwe1| zWmlB1qdbiA(C0jmnV<}GfbKtmcu^2*P^O?MBLZKt|As~ge8&AAO~2K@zbXelK|4T<{|y4`raF{=72kC2Kn(L4YyenWgrPiv z@^mr$t{#X5VuIMeL!7Ab6_kG$&#&5p*Z{+?5U|TZ`B!7llpVmp@skYz&n^8QfPJzL z0G6K_OJM9x+Wu2gfN45phANGt{7=C>i34CV{Xqlx(fWpeAoj^N0Biu`w+MVcCUyU* zDZuzO0>4Z6fbu^T_arWW5n!E45vX8N=bxTVeFoep_G#VmNlQzAI_KTIc{6>c+04vr zx@W}zE5JNSU>!THJ{J=cqjz+4{L4A{Ob9$ZJ*S1?Ggg3klFp!+Y1@K+pK1DqI|_gq z5ZDXVpge8-cs!o|;K73#YXZ3AShj50wBvuq3NTOZ`M&qtjj#GOFfgExjg8Gn8>Vq5 z`85n+9|!iLCZF5$HJ$Iu($dm?8~-ofu}tEc+-pyke=3!im#6pk_Wo8IA|fJwD&~~F zc16osQ)EBo58U7XDuMexaPRjU@h8tXe%S{fA0NH3vGJFhuyyO!Uyl2^&EOpX{9As0 zWj+P>{@}jxH)8|r;2HdupP!vie{sJ28b&bo!8`D^x}TE$%zXNb^X1p@0PJ86`dZyj z%ce7*{^oo+6%&~I!8hQy-vQ7E)0t0ybH4l%KltWOo~8cO`T=157JqL(oq_rC%ea&4 z2NcTJe-HgFjNg-gZ$6!Y`SMHrlj}Etf7?r!zQTPPSv}{so2e>Fjs1{gzk~LGeesX%r(Lh6rbhSo_n)@@G-FTQy93;l#E)hgP@d_SGvyCp0~o(Y;Ee8{ zdVUDbHm5`2taPUOY^MAGOw*>=s7=Gst=D+p+2yON!0%Hk` zz5mAhyT4lS*T3LS^WSxUy86q&GnoHxzQ6vm8)VS}_zuqG?+3td68_x;etQAdu@sc6 zQJ&5|4(I?~3d-QOAODHpZ=hlSg(lBZ!JZWCtHHSj`0Wh93-Uk)_S%zsJ~aD>{`A0~ z9{AG(e|q3g5B%wYKRxiL2Y$8(4w6bzchKuloQW#e&S3n+P- z8!ds-%f;TJ1>)v)##>gd{PdS2Oc3VaR`fr=`O8QIO(6(N!A?pr5C#6fc~Ge@N%Vvu zaoAX2&(a6eWy_q&UwOhU)|P3J0Qc%OdhzW=F4D|pt0E4osw;%<%Dn58hAWD^XnZD= z>9~H(3bmLtxpF?a7su6J7M*x1By7YSUbxGi)Ot0P77`}P3{)&5Un{KD?`-e?r21!4vTTnN(4Y6Lin?UkSM z`MXCTC1@4A4~mvz%Rh2&EwY))LeoT=*`tMoqcEXI>TZU9WTP#l?uFv+@Dn~b(>xh2 z;>B?;Tz2SR&KVb>vGiBSB`@U7VIWFSo=LDSb9F{GF^DbmWAfpms8Sx9OX4CnBJca3 zlj9(x!dIjN?OG1X4l*imJNvRCk}F%!?SOfiOq5y^mZW)jFL@a|r-@d#f7 z2gmU8L3IZq0ynIws=}~m^#@&C%J6QFo~Mo4V`>v7MI-_!EBMMtb%_M&kvAaN)@ZVw z+`toz&WG#HkWDjnZE!6nk{e-oFdL^$YnbOCN}JC&{$#$O27@|Tn-skXr)2ml2~O!5 zX+gYoxhoc7qoU?C^3~&!U?kRFtnSEecWuH0B0OvLodgUAi}8p1 zrO6RSXHH}DMc$&|?D004DiOVMHV8kXCP@7NKB zgaZq^^O<7PoKEp72kby@W0Z!Y*Ay{&vfg#C&gG@YVR9g?FEocMUi1gSN$+V+ayF45{a zuDZDTN}mS|;BO%gEf}pjBfN2-gIrU#G5~cucA;dokXW89%>AyXJJI z9X4UlIWA|ZYHgbI z5?oFk@A=Ik7lrEQPDH!H+b`7_Y~aDb_qa=B2^Y&Ow41cU=4WDd40dp5(QS-WMN-=Y z9g;6_-JdNU;|6cPwf$ak*aJIcwL@1n$#l~zi{c{EW?T;DaW*E8DYq?Umtz{nJ&w-M zEMyTDrC&9K$d|kZe2#ws6)L=7K+{ zQw{XnV6UC$6-rW0emqm8wJoeZK)wJIcV?dST}Z;G0Arq{dVDu0&4kd%N!3F1*;*pW zR&qUiFzK=@44#QGw7k1`3t_d8&*kBV->O##t|tonFc2YWrL7_eqg+=+k;!F-`^b8> z#KWCE8%u4k@EprxqiV$VmmtiWxDLgnGu$Vs<8rppV5EajBXL4nyyZM$SWVm!wnCj-B!Wjqj5-5dNXukI2$$|Bu3Lrw}z65Lc=1G z^-#WuQOj$hwNGG?*CM_TO8Bg-1+qc>J7k5c51U8g?ZU5n?HYor;~JIjoWH-G>AoUP ztrWWLbRNqIjW#RT*WqZgPJXU7C)VaW5}MiijYbABmzoru6EmQ*N8cVK7a3|aOB#O& zBl8JY2WKfmj;h#Q!pN%9o@VNLv{OUL?rixHwOZuvX7{IJ{(EdPpuVFoQqIOa7giLVkBOKL@^smUA!tZ1CKRK}#SSM)iQHk)*R~?M!qkCruaS!#oIL1c z?J;U~&FfH#*98^G?i}pA{ z9Jg36t4=%6mhY(quYq*vSxptes9qy|7xSlH?G=S@>u>Ebe;|LVhs~@+06N<4CViBk zUiY$thvX;>Tby6z9Y1edAMQaiH zm^r3v#$Q#2T=X>bsY#D%s!bhs^M9PMAcHbCc0FMHV{u-dwlL;a1eJ63v5U*?Q_8JO zT#50!RD619#j_Uf))0ooADz~*9&lN!bBDRUgE>Vud-i5ck%vT=r^yD*^?Mp@Q^v+V zG#-?gKlr}Eeqifb{|So?HM&g91P8|av8hQoCmQXkd?7wIJwb z_^v8bbg`SAn{I*4bH$u(RZ6*xUhuA~hc=8czK8SHEKTzSxgbwi~9(OqJB&gwb^l4+m`k*Q;_?>Y-APi1{k zAHQ)P)G)f|AyjSgcCFps)Fh6Bca*Xznq36!pV6Az&m{O8$wGFD? zY&O*3*J0;_EqM#jh6^gMQKpXV?#1?>$ml1xvh8nSN>-?H=V;nJIwB07YX$e6vLxH( zqYwQ>qxwR(i4f)DLd)-$P>T-no_c!LsN@)8`e;W@)-Hj0>nJ-}Kla4-ZdPJzI&Mce zv)V_j;(3ERN3_@I$N<^|4Lf`B;8n+bX@bHbcZTopEmDI*Jfl)-pFDvo6svPRoo@(x z);_{lY<;);XzT`dBFpRmGrr}z5u1=pC^S-{ce6iXQlLGcItwJ^mZx{m$&DA_oEZ)B{_bYPq-HA zcH8WGoBG(aBU_j)vEy+_71T34@4dmSg!|M8Vf92Zj6WH7Q7t#OHQqWgFE3ARt+%!T z?oLovLVlnf?2c7pTc)~cc^($_8nyKwsN`RA-23ed3sdj(ys%pjjM+9JrctL;dy8a( z@en&CQmnV(()bu|Y%G1-4a(6x{aLytn$T-;(&{QIJB9vMox11U-1HpD@d(QkaJdEb zG{)+6Dos_L+O3NpWo^=gR?evp|CqEG?L&Ut#D*KLaRFOgOEK(Kq1@!EGcTfo+%A&I z=dLbB+d$u{sh?u)xP{PF8L%;YPPW53+@{>5W=Jt#wQpN;0_HYdw1{ksf_XhO4#2F= zyPx6Lx2<92L-;L5PD`zn6zwIH`Jk($?Qw({erA$^bC;q33hv!d!>%wRhj# zal^hk+WGNg;rJtb-EB(?czvOM=H7dl=vblBwAv>}%1@{}mnpUznfq1cE^sgsL0*4I zJ##!*B?=vI_OEVis5o+_IwMIRrpQyT_Sq~ZU%oY7c5JMIADzpD!Upz9h@iWg_>>~j zOLS;wp^i$-E?4<_cp?RiS%Rd?i;f*mOz=~(&3lo<=@(nR!_Rqiprh@weZlL!t#NCc zO!QTcInq|%#>OVgobj{~ixEUec`E25zJ~*DofsQdzIa@5^nOXj2T;8O`l--(QyU^$t?TGY^7#&FQ+2SS3B#qK*k3`ye?8jUYSajE5iBbJls75CCc(m3dk{t?- zopcER9{Z?TC)mk~gpi^kbbu>b-+a{m#8-y2^p$ka4n60w;Sc2}HMf<8JUvhCL0B&Btk)T`ctE$*qNW8L$`7!r^9T+>=<=2qaq-;ll2{`{Rg zc5a0ZUI$oG&j-qVOuKa=*v4aY#IsoM+1|c4Z)<}lEDvy;5huB@1RJPquU2U*U-;gu z=En2m+qjBzR#DEJDO`WU)hdd{Vj%^0V*KoyZ|5lzV87&g_j~NCjwv0uQVqXOb*QrQ zy|Qn`hxx(58c70$E;L(X0uZZ72M1!6oeg)(cdKO ze0gDaTz+ohR-#d)NbAH4x{I(21yjwvBQfmpLu$)|m{XolbgF!pmsqJ#D}(ylp6uC> z{bqtcI#hT#HW=wl7>p!38sKsJ`r8}lt-q%Keqy%u(xk=yiIJiUw6|5IvkS+#?JTBl z8H5(Q?l#wzazujH!8o>1xtn8#_w+397*_cy8!pQGP%K(Ga3pAjsaTbbXJlQF_+m+-UpUUent@xM zg%jqLUExj~o^vQ3Gl*>wh=_gOr2*|U64_iXb+-111aH}$TjeajM+I20xw(((>fej-@CIz4S1pi$(#}P7`4({6QS2CaQS4NPENDp>sAqD z$bH4KGzXGffkJ7R>V>)>tC)uax{UsN*dbeNC*v}#8Y#OWYwL4t$ePR?VTyIs!wea+ z5Urmc)X|^`MG~*dS6pGSbU+gPJoq*^a=_>$n4|P^w$sMBBy@f*Z^Jg6?n5?oId6f{ z$LW4M|4m502z0t7g<#Bx%X;9<=)smFolV&(V^(7Cv2-sxbxopQ!)*#ZRhTBpx1)Fc zNm1T%bONzv6@#|dz(w02AH8OXe>kQ#1FMCzO}2J_mST)+ExmBr9cva-@?;wnmWMOk z{3_~EX_xadgJGv&H@zK_8{(x84`}+c?oSBX*Ge3VdfTt&F}yCpFP?CpW+BE^cWY0^ zb&uBN!Ja3UzYHK-CTyA5=L zEMW{l3Usky#ly=7px648W31UNV@K)&Ub&zP1c7%)`{);I4b0Q<)B}3;NMG2JH=X$U zfIW4)4n9ZM`-yRj67I)YSLDK)qfUJ_ij}a#aZN~9EXrh8eZY2&=uY%2N0UFF7<~%M zsB8=erOWZ>Ct_#^tHZ|*q`H;A)5;ycw*IcmVxi8_0Xk}aJA^ath+E;xg!x+As(M#0=)3!NJR6H&9+zd#iP(m0PIW8$ z1Y^VX`>jm`W!=WpF*{ioM?C9`yOR>@0q=u7o>BP-eSHqCgMDj!2anwH?s%i2p+Q7D zzszIf5XJpE)IG4;d_(La-xenmF(tgAxK`Y4sQ}BSJEPs6N_U2vI{8=0C_F?@7<(G; zo$~G=8p+076G;`}>{MQ>t>7cm=zGtfbdDXm6||jUU|?X?CaE?(<6bKDYKeHlz}DA8 zXT={X=yp_R;HfJ9h%?eWvQ!dRgz&Su*JfNt!Wu>|XfU&68iRikRrHRW|ZxzRR^`eIGt zIeiDgVS>IeExKVRWW8-=A=yA`}`)ZkWBrZD`hpWIxBGkh&f#ijr449~m`j6{4jiJ*C!oVA8ZC?$1RM#K(_b zL9TW)kN*Y4%^-qPpMP7d4)o?Nk#>aoYHT(*g)qmRUb?**F@pnNiy6Fv9rEiUqD(^O zzyS?nBrX63BTRYduaG(0VVG2yJRe%o&rVrLjbxTaAFTd8s;<<@Qs>u(<193R8>}2_ zuwp{7;H2a*X7_jryzriZXMg?bTuegABb^87@SsKkr2)0Gyiax8KQWstw^v#ix45EVrcEhr>!NMhprl$InQMzjSFH54x5k9qHc`@9uKQzvL4ihcq{^B zPrVR=o_ic%Y>6&rMN)hTZsI7I<3&`#(nl+3y3ys9A~&^=4?PL&nd8)`OfG#n zwAMN$1&>K++c{^|7<4P=2y(B{jJsQ0a#U;HTo4ZmWZYvI{+s;Td{Yzem%0*k#)vjpB zia;J&>}ICate44SFYY3vEelqStQWFihx%^vQ@Do(sOy7yR2@WNv7Y9I^yL=nZr3mb zXKV5t@=?-Sk|b{XMhA7ZGB@2hqsx}4xwCW!in#C zI@}scZlr3-NFJ@NFaJlhyfcw{k^vvtGl`N9xSo**rDW4S}i zM9{fMPWo%4wYDG~BZ18BD+}h|GQKc-g^{++3MY>}W_uq7jGHx{mwE9fZiPCoxN$+7 zrODGGJrOkcPQUB(FD5aoS4g~7#6NR^ma7-!>mHuJfY5kTe6PpNNKC9GGRiu^L31uG z$7v`*JknQHsYB!Tm_W{a32TM099djW%5e+j0Ve_ct}IM>XLF1Ap+YvcrLV=|CKo6S zb+9Nl3_YdKP6%Cxy@6TxZ>;4&nTneadr z_ES90ydCev)LV!dN=#(*f}|ZORFdvkYBni^aLbUk>BajeWIOcmHP#8S)*2U~QKI%S zyrLmtPqb&TphJ;>yAxri#;{uyk`JJqODDw%(Z=2`1uc}br^V%>j!gS)D*q*f_-qf8&D;W1dJgQMlaH5er zN2U<%Smb7==vE}dDI8K7cKz!vs^73o9f>2sgiTzWcwY|BMYHH5%Vn7#kiw&eItCqa zIkR2~Q}>X=Ar8W|^Ms41Fm8o6IB2_j60eOeBB1Br!boW7JnoeX6Gs)?7rW0^5psc- zjS16yb>dFn>KPOF;imD}e!enuIniFzv}n$m2#gCCv4jM#ArwlzZ$7@9&XkFxZ4n!V zj3dyiwW4Ki2QG{@i>yuZXQizw_OkZI^-3otXC{!(lUpJF33gI60ak;Uqitp74|B6I zgg{b=Iz}WkhCGj1M=hu4#Aw173YxIVbISaoc z-nLZC*6Tgivd5V`K%GxhBsp@SUU60-rfc$=wb>zdJzXS&-5(NRRodFk;Kxk!S(O(a0e7oY=E( zAyS;Ow?6Q&XA+cnkCb{28_1N8H#?J!*$MmIwLq^*T_9-z^&UE@A(z9oGYtFy6EZef LrJugUA?W`A8`#=m literal 0 HcmV?d00001 diff --git a/src/app/globals.scss b/src/app/globals.scss new file mode 100644 index 0000000..f2682b8 --- /dev/null +++ b/src/app/globals.scss @@ -0,0 +1,103 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer utilities { + .text-balance { + text-wrap: balance; + } +} + +/* 首页部分 */ +.bg-almostblack { + --tw-bg-opacity: 1; + background-color: rgb(16 18 21 / var(--tw-bg-opacity)); +} +.text-neutral-dark { + --tw-text-opacity: 1; + color: rgb(190 192 199 / var(--tw-text-opacity)); +} +.btn-tf-secondary { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); + border-width: 0.0625rem; + border-color: #ffffff15; + background: radial-gradient(89.39% 89.39% at 50% 50%, rgba(16, 18, 21, 0.1) 0, hsla(0, 0%, 100%, 0.15) 100%); + transition: all 0.15s ease-in-out; +} +.btn-tf-primary { + --tw-text-opacity: 1; + font-weight: 600; + border-radius: 9999px; + background: linear-gradient(180deg, #4bde8150, #a8ffc8 50%, #4bde81); + transition: all 0.25s ease; +} +.btn-tf { + padding: 8px 20px; + position: relative; + height: -moz-fit-content; + height: fit-content; + border-radius: 624.9375rem; + font-weight: 500; +} +.btn-tf-primary-container { + border-radius: 624.9375rem; + border-width: 0.0625rem; + --tw-text-opacity: 1; + --tw-border-opacity: 1; + border-color: rgb(75 222 129 / var(--tw-border-opacity)); + display: flex; + padding: 0.0938rem; + background: linear-gradient(180deg, #a8ffc8, #4bde81); + box-shadow: + 0 0 0 0.25rem #ffffff24, + 0 0 0 0.0625rem #4bde81; +} +.btn-tf-primary { + --tw-text-opacity: 1; + font-weight: 600; + border-radius: 624.9375rem; + background: linear-gradient(180deg, #4bde8150, #a8ffc8 50%, #4bde81); + transition: all 0.25s ease; +} +.btn-tf-primary, +.btn-tf-primary-container { + color: rgb(16 18 21 / var(--tw-text-opacity)); +} +.gradient-bg { + background: linear-gradient(180deg, rgba(75, 222, 129, 0.05), rgba(75, 222, 129, 0)), #15171a; +} +.btn-tf-sm { + padding: 6px 14px; + height: auto; + border-radius: 624.9375rem; + height: 32px; + padding-left: 12px; + padding-right: 12px; + min-height: 32px; + font-size: 14px; +} +.diagonal-pattern { + background-color: rgba(229, 229, 247, 0); + opacity: 0.8; + background: repeating-linear-gradient( + -45deg, + #262c2c, + #262c2c 0.0938rem, + rgba(229, 229, 247, 0) 0, + rgba(229, 229, 247, 0) 0.375rem + ); +} + +.box-shadow-tf { + box-shadow: + 0 0.0625rem 0.375rem -0.125rem rgba(0, 0, 0, 0.15), + 0 0.5rem 4.375rem -0.375rem rgba(0, 0, 0, 0.12); +} +.kbd { + @apply rounded-[.25rem] border-[.0625rem] border-b-[.125rem]; /* 设置圆角和边框 */ + @apply px-[4px]; /* 设置左右内边距 */ + @apply text-[14px] leading-[20px]; /* 设置字体大小和行高 */ + @apply min-h-[1.6em] min-w-[1.6em]; /* 设置最小高度和宽度 */ + @apply text-info; +} diff --git a/src/app/layout.tsx b/src/app/layout.tsx new file mode 100644 index 0000000..54c40c0 --- /dev/null +++ b/src/app/layout.tsx @@ -0,0 +1,57 @@ +import type { Metadata } from "next"; +import { Suspense } from "react"; +import { Inter } from "next/font/google"; +import { NextIntlClientProvider } from "next-intl"; +import { getLocale, getMessages } from "next-intl/server"; +import { GetMetadata } from "@/apis/auth"; +import "./globals.scss"; +import Loading from "./loading"; +import CombinedProviders from "@/contexts/CombinedProviders"; + +const inter = Inter({ subsets: ["latin"] }); + +// export const metadata: Metadata = { +// title: "typeframes", +// description: "Generated by typeframes", +// }; +// 将metadata改为异步函数,获取动态SEO数据 +export async function generateMetadata(): Promise { + const res = await GetMetadata(); // 调用API获取SEO数据 + if (res.code === 200) { + const seoData = res.data; + const locale = await getLocale(); + return { + title: seoData["title_" + locale] || "typeframes", + description: + seoData["description_" + locale] || "Generated by typeframes", + keywords: seoData["keywords_" + locale] || "", + }; + } else { + return { + title: "typeframes", + description: "Generated by typeframes", + }; + } +} +async function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + const locale = await getLocale(); + + const messages = await getMessages(); + + return ( + + + + }> + {children} + + + + + ); +} +export default RootLayout; diff --git a/src/app/loading.tsx b/src/app/loading.tsx new file mode 100644 index 0000000..606baad --- /dev/null +++ b/src/app/loading.tsx @@ -0,0 +1,14 @@ +import { useTranslations } from "next-intl"; + +export default function Loading() { + const t = useTranslations("loading"); + + return ( +
+
+ + {t("preparing")} +
+
+ ); +} diff --git a/src/app/login/login.module.css b/src/app/login/login.module.css new file mode 100644 index 0000000..2d5aa5b --- /dev/null +++ b/src/app/login/login.module.css @@ -0,0 +1,12 @@ +.login_form { + background-color: rgba(255, 255, 255, 0.1); /* 半透明背景 */ + padding: 30px; + border-radius: 15px; + backdrop-filter: blur(10px); /* 背景模糊效果 */ + box-shadow: 0 4px 30px rgba(0, 0, 0, 0.1); /* 轻微阴影 */ + + width: 100%; + border: 1px solid rgba(74,222,128, 0.9); /* 添加微弱的白色边框 */ + +} + diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx new file mode 100644 index 0000000..feae4c4 --- /dev/null +++ b/src/app/login/page.tsx @@ -0,0 +1,69 @@ +"use client"; +import Link from "next/link"; + +import LoginForm from "@/ui/login/login-form"; +import { useState } from "react"; +import RegisterForm from "@/ui/login/register-form"; +import styles from "./login.module.css"; +import { useTranslations } from "next-intl"; + +type FormStatus = "login" | "register"; +export default function Page() { + const [formStatus, setFormStatus] = useState("login"); + const t = useTranslations("pageFooter"); // 用于获取底部信息的翻译 + + return ( +
+ +
+
+ + {/* 在此处添加您的 Logo,如果有的话 */} + +
+ {t("welcome")} 👋 +
+
+ {formStatus === "login" ? ( + setFormStatus("register")} + /> + ) : ( + setFormStatus("login")} /> + )} +
+
+
+ + {/* 底部版权信息 */} + +
+ ); +} diff --git a/src/components/GlobalLoading.tsx b/src/components/GlobalLoading.tsx new file mode 100644 index 0000000..c9ab271 --- /dev/null +++ b/src/components/GlobalLoading.tsx @@ -0,0 +1,21 @@ +"use client"; +// components/GlobalLoading.tsx +import React from "react"; +import useLoadingStore from "@/store/loadingStore"; + +const GlobalLoading: React.FC = () => { + const isLoading = useLoadingStore((state) => state.isLoading); + const text = useLoadingStore((state) => state.text); + if (!isLoading) { + return null; // 如果不在加载状态,则不渲染任何内容 + } + + return ( +
+
+
{text}
+
+ ); +}; + +export default GlobalLoading; diff --git a/src/components/InputBox.tsx b/src/components/InputBox.tsx new file mode 100644 index 0000000..de8f2d9 --- /dev/null +++ b/src/components/InputBox.tsx @@ -0,0 +1,23 @@ +export default function InputBox({ + children, + serial, + title, +}: Readonly<{ + children: React.ReactNode; + serial: number; + title: string; +}>) { + return ( +
+
+
+ {serial} + +
+
+
+ {children} +
+
+ ); +} diff --git a/src/components/ListBox.tsx b/src/components/ListBox.tsx new file mode 100644 index 0000000..d5676d2 --- /dev/null +++ b/src/components/ListBox.tsx @@ -0,0 +1,67 @@ +import { + Listbox, + ListboxButton, + ListboxOption, + ListboxOptions, +} from "@headlessui/react"; +import { Dispatch, SetStateAction, useState } from "react"; +import { HiChevronUpDown } from "react-icons/hi2"; +import { BsCheck2 } from "react-icons/bs"; + +type TListBoxItem = { + id: number; + name: string; + value: string; +}; +type TListBoxProps = { + list: Array; + value: TListBoxItem; + onChange: Dispatch>; +}; +export default function ListBox({ + list, + value: selected, + onChange: setSelected, +}: Readonly) { + return ( + <> + + + + + {selected.name} + + + + + + + + {list.map((item) => ( + +
+
+ + {item.name} + + {selected.id === item.id ? ( + + + + ) : ( + "" + )} +
+
+
+ ))} +
+
+ + ); +} diff --git a/src/components/Loading.tsx b/src/components/Loading.tsx new file mode 100644 index 0000000..ad5af86 --- /dev/null +++ b/src/components/Loading.tsx @@ -0,0 +1,15 @@ +"use client"; +import React from "react"; +import { useTranslations } from "next-intl"; + +const Loading: React.FC = () => { + const t = useTranslations("loading"); + return ( +
+
+
{t("preparing")}
+
+ ); +}; + +export default Loading; diff --git a/src/components/PaymentDialog.tsx b/src/components/PaymentDialog.tsx new file mode 100644 index 0000000..a97f441 --- /dev/null +++ b/src/components/PaymentDialog.tsx @@ -0,0 +1,57 @@ +// components/PaymentDialog.tsx +import * as Dialog from "@radix-ui/react-dialog"; +import { IoClose } from "react-icons/io5"; +import { useTranslations } from "next-intl"; +import { FaAlipay, FaPaypal } from "react-icons/fa"; + +interface PaymentDialogProps { + open: boolean; + setOpen: (open: boolean) => void; + onHandlePay: (platform: "paypal" | "alipay") => void; +} + +export default function PaymentDialog({ + open, + setOpen, + onHandlePay, +}: PaymentDialogProps) { + const t = useTranslations("pricing"); // 使用翻译 + return ( + + + + + + {/* 选择支付方式 */} + {t("ChoosePaymentMethod")} + + + {/* 请选择您要使用的支付方式 */} + {t("SelectPaymentMethod")} + +
+ + +
+ + + +
+
+
+ ); +} diff --git a/src/components/UploadAudio.tsx b/src/components/UploadAudio.tsx new file mode 100644 index 0000000..3a4be1f --- /dev/null +++ b/src/components/UploadAudio.tsx @@ -0,0 +1,204 @@ +import { useState, useEffect, useRef } from "react"; +import { BiUpload } from "react-icons/bi"; +import { FaPlay, FaPause } from "react-icons/fa"; +import useFetch from "@/hooks/useFetch"; +import { useToast } from "@/contexts/ToastContext"; // 假设 ToastContext 在 contexts 文件夹中 +import { useTranslations } from "next-intl"; // 导入国际化 hook + +interface AudioUploadProps { + onChange?: (audioUrl: string) => void; +} + +const UploadAudio = ({ onChange }: AudioUploadProps) => { + const t = useTranslations("uploadAudio"); // 使用翻译 + const [file, setFile] = useState(null); + const [audioUrl, setAudioUrl] = useState(null); + const [isPlaying, setIsPlaying] = useState(false); + const [currentTime, setCurrentTime] = useState(0); + const [duration, setDuration] = useState(0); + const [uploading, setUploading] = useState(false); + + const audioRef = useRef(null); + const { fetchData } = useFetch({ + url: "/api/upload-audio/", + method: "POST", + }); + const { addToast } = useToast(); + + const handleFileChange = async (e: React.ChangeEvent) => { + const selectedFile = e.target.files?.[0]; + if (selectedFile) { + setFile(selectedFile); + setUploading(true); + + const formData = new FormData(); + formData.append("audio", selectedFile); + + fetchData(formData) + .then((res) => { + console.log("upload audio:", res); + const audioUrl = res.audio_url; // 假设返回数据中有 audio_url + setAudioUrl(audioUrl); + addToast(t("uploadSuccess"), "success"); // 使用翻译 + if (onChange) { + onChange(audioUrl); + } + }) + .finally(() => { + setUploading(false); + }); + } + }; + + const togglePlayPause = () => { + if (audioRef.current) { + if (isPlaying) { + audioRef.current.pause(); + } else { + audioRef.current.play(); + } + setIsPlaying(!isPlaying); + } + }; + + const handleTimeUpdate = () => { + if (audioRef.current) { + setCurrentTime(audioRef.current.currentTime); + } + }; + + const handleLoadedMetadata = () => { + if (audioRef.current) { + setDuration(audioRef.current.duration); + } + }; + + const handleEnded = () => { + setIsPlaying(false); + setCurrentTime(0); // 重置播放时间 + }; + + useEffect(() => { + if (audioRef.current) { + audioRef.current.addEventListener("timeupdate", handleTimeUpdate); + audioRef.current.addEventListener( + "loadedmetadata", + handleLoadedMetadata + ); + audioRef.current.addEventListener("ended", handleEnded); + } + return () => { + if (audioRef.current) { + audioRef.current.removeEventListener( + "timeupdate", + handleTimeUpdate + ); + audioRef.current.removeEventListener( + "loadedmetadata", + handleLoadedMetadata + ); + audioRef.current.removeEventListener("ended", handleEnded); + } + }; + }, [audioUrl]); + + const formatTime = (time: number) => { + const minutes = Math.floor(time / 60); + const seconds = Math.floor(time % 60); + return `${minutes}:${seconds < 10 ? "0" : ""}${seconds}`; + }; + + const calculateGradient = () => { + const percentage = (currentTime / duration) * 100 || 0; + return `linear-gradient(to right, rgba(74, 222, 128, 0.2) ${percentage}%, rgba(74, 222, 128, 0.05) ${percentage}%)`; + }; + + return ( +
+
+ document.getElementById("audio-upload-input")?.click() + } + > + + {uploading ? ( + + {t("uploading")} + + ) : ( + <> + +
+ {t("dropOrClick")} +
+ + )} +
+ {audioUrl && ( +
+
+ +
+
+
+ {isPlaying ? ( + + ) : ( + + )} +
+
+
+ {file?.name} +
+
+ {t("audioFile")} +
+
+
+
+ {formatTime(currentTime)} + / + {formatTime(duration)} +
+
+
+
+ )} +
+ ); +}; + +export default UploadAudio; diff --git a/src/components/UploadImage.tsx b/src/components/UploadImage.tsx new file mode 100644 index 0000000..d432ffb --- /dev/null +++ b/src/components/UploadImage.tsx @@ -0,0 +1,76 @@ +import { useToast } from "@/contexts/ToastContext"; +import useFetch from "@/hooks/useFetch"; +import { useState } from "react"; +import { TfiUser } from "react-icons/tfi"; +import { useTranslations } from "next-intl"; +import Image from "next/image"; + +interface ImageUploadProps { + onChange?: (imageUrl: string) => void; +} + +const ImageUpload = ({ onChange }: ImageUploadProps) => { + const t = useTranslations("imageUpload"); // 使用翻译 + const [previewUrl, setPreviewUrl] = useState(null); + const [uploading, setUploading] = useState(false); + const { addToast } = useToast(); + + const { fetchData } = useFetch({ + url: "/api/upload-avatar/", + method: "POST", + }); + + const handleImageChange = (e: React.ChangeEvent) => { + const file = e.target.files?.[0]; + if (file) { + setUploading(true); + const formData = new FormData(); + formData.append("avatar", file); + fetchData(formData) + .then((res) => { + const imageUrl = URL.createObjectURL(file); + setPreviewUrl(imageUrl); + addToast(t("uploadSuccess"), "success"); // 使用翻译 + if (onChange) { + onChange(res.avatar_url); + } + }) + .finally(() => { + setUploading(false); + }); + } + }; + + return ( +
+ +
+ {uploading ? ( + + {t("loading")} + + ) : previewUrl ? ( + Preview + ) : ( + <> + +

{t("uploadImage")}

{/* 使用翻译 */} + + )} +
+
+ ); +}; + +export default ImageUpload; diff --git a/src/components/logics/UserInfo.tsx b/src/components/logics/UserInfo.tsx new file mode 100644 index 0000000..1e2f46e --- /dev/null +++ b/src/components/logics/UserInfo.tsx @@ -0,0 +1,24 @@ +"use client"; + +import useFetch from "@/hooks/useFetch"; +import useUserStore from "@/store/userStore"; +import { useEffect } from "react"; + +export default function UserInfo() { + const setUser = useUserStore((state) => state.setUser); + const { + fetchData: GetUserinfo, + loading: userinfoLoading, + data: userinfoData, + } = useFetch({ + url: "/api/profile/", + method: "POST", + }); + useEffect(() => { + GetUserinfo().then((res) => { + console.log("userinfo", res); + setUser(res); + }); + }, []); + return null; +} diff --git a/src/contexts/CombinedProviders.tsx b/src/contexts/CombinedProviders.tsx new file mode 100644 index 0000000..8246665 --- /dev/null +++ b/src/contexts/CombinedProviders.tsx @@ -0,0 +1,9 @@ +import { ToastProvider } from "@/contexts/ToastContext"; +import { UserProvider } from "@/contexts/UserContext"; +export default function CombinedProviders({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return {children}; +} diff --git a/src/contexts/ToastContext/index.tsx b/src/contexts/ToastContext/index.tsx new file mode 100644 index 0000000..0756b19 --- /dev/null +++ b/src/contexts/ToastContext/index.tsx @@ -0,0 +1,103 @@ +// components/ToastProvider.tsx +"use client"; +import React, { createContext, useContext, useState, ReactNode } from "react"; +import { motion, AnimatePresence } from "framer-motion"; +import { MdError } from "react-icons/md"; +import { MdCheckCircle } from "react-icons/md"; + +interface ToastContextType { + addToast: (message: string, type?: ToastType) => void; + addToastError: (message: string) => void; + addToastSuccess: (message: string) => void; +} +type ToastType = "default" | "error" | "success"; +interface Toast { + id: number; + message: string; + type: ToastType; +} + +const ToastContext = createContext(undefined); + +export const ToastProvider: React.FC<{ children: ReactNode }> = ({ + children, +}) => { + const [toasts, setToasts] = useState([]); + const [nextId, setNextId] = useState(0); + + const addToast = (message: string, type: ToastType = "default") => { + setToasts((prevToasts) => [ + ...prevToasts, + { id: nextId, message, type }, + ]); + setNextId(nextId + 1); + }; + const addToastError = (message: string) => { + addToast(message, "error"); + }; + + const addToastSuccess = (message: string) => { + addToast(message, "success"); + }; + const removeToast = (id: number) => { + setToasts((prevToasts) => + prevToasts.filter((toast) => toast.id !== id) + ); + }; + + return ( + + {children} +
+ + {toasts.map((toast, index) => ( + + setTimeout(() => removeToast(toast.id), 3000) + } + > +
+ {toast.type === "error" && ( + + )} + {toast.type === "success" && ( + + )} + {toast.message} +
+
+ ))} +
+
+
+ ); +}; + +export const useToast = () => { + const context = useContext(ToastContext); + if (context === undefined) { + throw new Error("useToast must be used within a ToastProvider"); + } + return context; +}; diff --git a/src/contexts/UserContext.tsx b/src/contexts/UserContext.tsx new file mode 100644 index 0000000..ce0f942 --- /dev/null +++ b/src/contexts/UserContext.tsx @@ -0,0 +1,55 @@ +"use client"; +import useFetch from "@/hooks/useFetch"; +// context/UserContext.tsx +import React, { createContext, useContext, useState, ReactNode } from "react"; + +interface User { + username: string; + email: string; + phone: string; + isMember: boolean; + points: number; + referralCode: string; + commissionRate: number; +} + +// 定义上下文的类型 +interface UserContextType { + user: User | null; + setUser: (user: User | null) => void; +} + +// 创建上下文,初始值为 null +const UserContext = createContext(null); + +// 创建 Provider 组件 +export const UserProvider: React.FC<{ children: ReactNode }> = ({ + children, +}) => { + const [user, setUser] = useState(null); + const { + fetchData: GetUserinfo, + loading: userinfoLoading, + data: userinfoData, + } = useFetch({ + url: "/api/profile/", + method: "GET", + }); + // GetUserinfo().then((res) => { + // console.log("userinfo", res); + // }); + return ( + + {children} + + ); +}; + +// 自定义钩子,方便在组件中使用上下文 +export const useUser = (): UserContextType => { + const context = useContext(UserContext); + if (!context) { + throw new Error("useUser must be used within a UserProvider"); + } + return context; +}; diff --git a/src/hooks/useFetch.tsx b/src/hooks/useFetch.tsx new file mode 100644 index 0000000..071623b --- /dev/null +++ b/src/hooks/useFetch.tsx @@ -0,0 +1,173 @@ +"use client"; +import { useState } from "react"; +import queryString from "query-string"; +import { useToast } from "@/contexts/ToastContext"; + +type Method = "GET" | "POST" | "PUT" | "DELETE" | "PATCH"; + +type Params = Record; + +interface UseFetch { + url: string; + method: Method; + cacheTime?: number; +} + +interface BaseResponse { + data: T; + code: number; + message: string; +} +type Config = + | { next: { revalidate: number } } + | { cache: "no-store" } + | { cache: "force-cache" }; + +const useFetch = ({ url, method, cacheTime = 0 }: UseFetch) => { + const [data, setData] = useState(null); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + + const { addToast } = useToast(); + const fetchData = async (params?: Params): Promise => { + setError(null); + setLoading(true); + + return new Promise(async (resolve, reject) => { + try { + const { url: requestUrl, options } = interceptorsRequest({ + url, + method, + params, + cacheTime, + }); + const response = await fetch(requestUrl, options); + + const result = await interceptorsResponse>( + response + ); + console.log("response", response); + console.log("result", result); + setData(result.data); + resolve(result.data); // 成功时 resolve 结果 + } catch (err: any) { + setError(err.message); + addToast(err.message, "error"); + reject(err.message); // 失败时 reject 错误信息 + } finally { + setLoading(false); + } + }); + }; + + return { fetchData, data, loading, error }; +}; + +// 请求拦截器 +const interceptorsRequest = ({ + url, + method, + params, + cacheTime, +}: UseFetch & { params?: Params }) => { + let queryParams = ""; // url 参数 + let requestPayload: any = ""; // 请求体数据 + + const headers = { + // authorization: `Bearer ...`, + }; + + const config: Config = + cacheTime || cacheTime === 0 + ? cacheTime > 0 + ? { next: { revalidate: cacheTime } } + : { cache: "no-store" } + : { cache: "force-cache" }; + + if (method === "GET" || method === "DELETE") { + // GET/DELETE 请求不能将参数放在 body 中,只能拼接到 URL 上 + if (params) { + queryParams = queryString.stringify(params); + url = `${url}?${queryParams}`; + } + } else { + // 非 form-data 传输 JSON 数据格式 + if (Object.prototype.toString.call(params) === "[object FormData]") { + requestPayload = params; // 如果是 FormData 类型,不做处理 + } else if ( + !["[object FormData]", "[object URLSearchParams]"].includes( + Object.prototype.toString.call(params) + ) + ) { + Object.assign(headers, { "Content-Type": "application/json" }); + requestPayload = JSON.stringify(params); + } + } + + return { + url, + options: { + method, + headers, + body: + method !== "GET" && method !== "DELETE" + ? requestPayload + : undefined, + ...config, + }, + }; +}; + +// 响应拦截器 +const interceptorsResponse = (res: Response): Promise => { + return new Promise((resolve, reject) => { + const requestUrl = res.url; + if (res.ok) { + res.clone() + .text() + .then((text) => { + try { + const data = JSON.parse(text); + console.log("data", data); + if (!data.code) { + return resolve(res.json() as Promise); + } + if (data.code === 200) { + return resolve(res.json() as Promise); + } else if (data.code === 401) { + console.log("data.code", data.code); + window.location.href = "/login"; + return reject({ + message: data.message, + url: requestUrl, + }); + } else { + return reject({ + message: data.message, + url: requestUrl, + }); + } + } catch { + console.log("catch"); + return reject({ message: text, url: requestUrl }); + } + }); + } else { + res.clone() + .text() + .then((text) => { + try { + const errorData = JSON.parse(text); + return reject({ + message: errorData || "接口错误", + url: requestUrl, + }); + } catch { + return reject({ message: text, url: requestUrl }); + } + }); + } + }); +}; + +export default useFetch; diff --git a/src/i18n/request.ts b/src/i18n/request.ts new file mode 100644 index 0000000..f5102e7 --- /dev/null +++ b/src/i18n/request.ts @@ -0,0 +1,27 @@ +import { getRequestConfig } from 'next-intl/server'; +import { headers } from "next/headers"; +export default getRequestConfig(async () => { + const headersList = headers(); + const acceptLanguage = headersList.get("accept-language"); + + // 提取首选语言 + let locale = 'en'; // 默认语言 + if (acceptLanguage) { + // 根据首选语言选择合适的 locale + const preferredLanguages = acceptLanguage.split(',').map(lang => lang.split(';')[0].trim()); + const supportedLocales = ['en', 'zh']; // 支持的语言列表 + + // 检查首选语言是否在支持的语言列表中 + for (const lang of preferredLanguages) { + if (supportedLocales.includes(lang)) { + locale = lang; + break; + } + } + } + + return { + locale, + messages: (await import(`../../public/locales/${locale}.json`)).default + }; +}); \ No newline at end of file diff --git a/src/middleware.ts b/src/middleware.ts new file mode 100644 index 0000000..00a0765 --- /dev/null +++ b/src/middleware.ts @@ -0,0 +1,54 @@ +import { NextResponse } from 'next/server'; +import type { NextRequest } from 'next/server'; +import routes from '@/models/routes'; +import { match } from '@formatjs/intl-localematcher'; +import Negotiator from 'negotiator'; + +// 支持的语言 +const locales = ['en-US', 'zh']; +const defaultLocale = 'en-US'; + +export function middleware(request: NextRequest) { + const { pathname } = request.nextUrl; // 获取请求的路径 + + // 获取请求中的 cookie + const sessionid = request.cookies.get('sessionid'); // 假设你的 session id 是 'sessionid' + const url = new URL(request.url); + + // // 获取用户的语言设置 + // const negotiatorHeaders = { 'accept-language': request.headers.get('accept-language') || '' }; + // const languages = new Negotiator({ headers: negotiatorHeaders }).languages(); + // const selectedLocale = match(languages, locales, defaultLocale); + // console.log('languages', languages, selectedLocale) + // 如果用户已登录,且访问的是登录页面,则重定向到创建页面 + if (sessionid && pathname === '/login') { + return NextResponse.redirect(new URL('/create', request.url)); + } + + // 查找当前路径是否需要认证 + const route = routes.find(route => pathname === route.path); + + // 如果路由需要认证,且没有 sessionid,则重定向到登录页面 + if (route && route.requiresAuth && !sessionid) { + return NextResponse.redirect(new URL('/login', request.url)); + } + const openid = url.searchParams.get('openid'); + + // 如果 URL 中存在 openid 参数 + if (openid) { + // 创建一个新的响应对象,并设置 cookie + const response = NextResponse.next(); + response.cookies.set('openid', openid, { + path: '/', + httpOnly: true, + maxAge: 60 * 60 * 24 // 设置cookie有效期为1天 + }); + return response; + } + // 在返回响应时,将用户的语言环境设置到响应头中 + const response = NextResponse.next(); + // response.headers.set('Content-Language', selectedLocale); + + // 继续处理请求 + return response; +} diff --git a/src/models/routes.ts b/src/models/routes.ts new file mode 100644 index 0000000..4f2b61e --- /dev/null +++ b/src/models/routes.ts @@ -0,0 +1,17 @@ +interface Route { + name: string; + path: string; + requiresAuth: boolean; +} + +const routes: Route[] = [ + { name: "Index", path: "/", requiresAuth: false }, + { name: "Create", path: "/create", requiresAuth: true }, + { name: "Home", path: "/home", requiresAuth: true }, + { name: "Projects", path: "/projects", requiresAuth: false }, + { name: "Queue", path: "/queue", requiresAuth: false }, + { name: "Login", path: "/login", requiresAuth: false }, + { name: "terms", path: "/terms", requiresAuth: false }, +]; + +export default routes; \ No newline at end of file diff --git a/src/store/loadingStore.ts b/src/store/loadingStore.ts new file mode 100644 index 0000000..53c0bc5 --- /dev/null +++ b/src/store/loadingStore.ts @@ -0,0 +1,18 @@ +// store/loadingStore.ts +import { create } from 'zustand'; + +interface LoadingState { + isLoading: boolean; + text: string; + showLoading: (text?: string) => void; + hideLoading: () => void; +} + +const useLoadingStore = create((set) => ({ + isLoading: false, + text: "", + showLoading: (text: string = "loading...") => set({ isLoading: true, text: text }), + hideLoading: () => set({ isLoading: false }), +})); + +export default useLoadingStore; diff --git a/src/store/userStore.ts b/src/store/userStore.ts new file mode 100644 index 0000000..97f0b06 --- /dev/null +++ b/src/store/userStore.ts @@ -0,0 +1,24 @@ +// store/userStore.ts +import { create } from 'zustand'; +interface User { + username: string; + email: string; + phone: string; + isMember: boolean; + points: number; + referralCode: string; + commissionRate: number; +} +interface UserState { + user: User | null; + setUser: (userInfo: User) => void; + clearUser: () => void; +} + +const useUserStore = create((set) => ({ + user: null, + setUser: (userInfo) => set({ user: userInfo }), + clearUser: () => set({ user: null }), +})); + +export default useUserStore; diff --git a/src/ui/(console)/create/article.tsx b/src/ui/(console)/create/article.tsx new file mode 100644 index 0000000..abe994d --- /dev/null +++ b/src/ui/(console)/create/article.tsx @@ -0,0 +1,3 @@ +export default function Article() { + return <>文章转视频; +} diff --git a/src/ui/(console)/create/avatar/index.module.css b/src/ui/(console)/create/avatar/index.module.css new file mode 100644 index 0000000..d3da5cf --- /dev/null +++ b/src/ui/(console)/create/avatar/index.module.css @@ -0,0 +1,38 @@ +.stroke-text { + font-weight: bold; + text-transform: uppercase; + color: white; + position: relative; + display: inline-block; + z-index: 1; +} + +.stroke-text:after, .stroke-text:before { + content: attr(data-text); + position: absolute; + height: 100%; + width: 100%; + -webkit-text-stroke: .2em #000; + z-index: -1; /* 确保它们位于主文本前 */ +} +.stroke-text:after{ + left: .05em; + top: .05em; +} +.stroke-text:before{ + left: 0; + top: 0; +} + +.glow-text-effect{ + color: var(--text-color, #4ade80); + text-shadow: 0 0 .3em rgba(0, 0, 0, .7), 0 0 .05em var(--text-color, #4ade80), 0 0 .1em var(--text-color, #4ade80), 0 0 .15em var(--text-color, #4ade80), 0 0 .2em var(--text-color, #4ade80), 0 0 .25em var(--text-color, #4ade80); +} +.bevel-text-effect { + display: inline-flex; + position: relative; + color: var(--text-color, #4ade80); + -webkit-text-stroke: .025em var(--text-color, #4ade80); + -webkit-text-fill-color: transparent; + text-shadow: 0 .025em .0375em var(--text-color, #4ade80), 0 0 0 #fff; +} \ No newline at end of file diff --git a/src/ui/(console)/create/avatar/index.tsx b/src/ui/(console)/create/avatar/index.tsx new file mode 100644 index 0000000..8a15910 --- /dev/null +++ b/src/ui/(console)/create/avatar/index.tsx @@ -0,0 +1,653 @@ +import InputBox from "@/components/InputBox"; +import ListBox from "@/components/ListBox"; +import { useToast } from "@/contexts/ToastContext"; +import useFetch from "@/hooks/useFetch"; +import classNames from "classnames"; +import { use, useEffect, useState } from "react"; +import { MdCheckCircle } from "react-icons/md"; +import VideoSelect, { VideoData } from "../components/video"; +import useUserStore from "@/store/userStore"; +import useLoadingStore from "@/store/loadingStore"; +import { useRouter } from "next/navigation"; +import UploadImage from "@/components/UploadImage"; +import styles from "./index.module.css"; +import { Switch } from "@headlessui/react"; +import { + PiAlignTopSimple, + PiAlignCenterVerticalSimple, + PiAlignBottomSimple, +} from "react-icons/pi"; +import { useTranslations } from "next-intl"; +export default function Avatar() { + const router = useRouter(); + const t = useTranslations("tiktok"); + const { addToast, addToastSuccess, addToastError } = useToast(); + const [rate, setRate] = useState(0.1); + const [enabledCaptions, setEnabledCaptions] = useState(false); + const ratioList = [ + // { + // name: "16 / 9", + // id: 1, + // value: "16 / 9", + // }, + // { + // name: "1 / 1", + // id: 2, + // value: "1 / 1", + // }, + { + name: "9 / 16", + id: 1, + value: "9 / 16", + }, + ]; + const showLoading = useLoadingStore((state) => state.showLoading); + const hideLoading = useLoadingStore((state) => state.hideLoading); + + const { + fetchData: createFetch, + loading: createLoading, + data: createResult, + } = useFetch({ + url: "/api/create-avatar-video/", + method: "POST", + }); + const create = () => { + const requestData = { + text: text, + voice: videoData.videoSelect, + style: videoData.style, + ratio: ratio.value, + rate: rate, + mediaType: mediaType.value, + selectedAvatar: imageUrl, + slug: "create-avatar-video", + }; + console.log("requestData", requestData); + if (text === "") { + addToastError(t("enterVideoText")); + return; + } + if (imageUrl === "") { + addToastError(t("uploadAvatarImage")); + return; + } + if (enabledCaptions) { + requestData["captionPreset"] = captionPreset; + requestData["captionPosition"] = captionPosition; + } + showLoading("creating..."); + createFetch(requestData) + .then((res) => { + console.log("create result:", res); + if (res.success === 1) { + addToastSuccess(t("createSuccess")); + router.push("/projects"); + } else { + addToastError(t("createFailed")); + } + }) + .finally(() => { + hideLoading(); + }); + }; + + const [ratio, setRatio] = useState(ratioList[0]); + + const [captionPreset, setCaptionPreset] = useState("Wrap 1"); + + const [captionPosition, setCaptionPosition] = useState("bottom"); + const mediaTypeList = [ + { id: 1, name: t("stockVideo"), value: "stockVideo" }, + { id: 2, name: t("movingImage"), value: "movingImage" }, + ]; + + const [mediaType, setMediaType] = useState(mediaTypeList[1]); + + const [videoData, setVideoData] = useState({ + language: "", // 国家语种 + videoSelect: "", // 讲话人 + style: "", // 讲话风格 + }); + const handleVideoDataChange = (newData: VideoData) => { + setVideoData(newData); + }; + + const [imageUrl, setImageUrl] = useState(""); + const handleImageDataChange = (imageUrl: string) => { + setImageUrl(imageUrl); + }; + const [text, setText] = useState(""); + + return ( + <> +

{t("useTool")}

+ + + + {t("videoTextTip")} + + + + + {/* + 💡 Tip: use short, punctuated sentences. + */} + + + {/* + {t("voicePunctuationTip")} + */} + + + +
+
+
+ +
+
+
+
+ {t("selectFootageType")} +
+
+ {t("dynamicOrVideo")} +
+
+
+
+
+
+ +
+
+
+
+ {t("chooseScreenRatio")} +
+
+ {t("adaptScreenRatio")} +
+
+
+
+
+
+ + setRate(Number(e.target.value)) + } + /> +
+
+ | + | + | + | + | + | + | + | + | + | +
+
+
+
+ {t("chooseScreenRatio")} +
+
+ {t("adaptScreenRatio")} +
+
+
+
+ +
+
+
+
+ + + +
+ 是否开启字幕 +
+
+ {enabledCaptions && ( + <> +
+
+ {t("selectPreset")} +
+
+ +
+
+ setCaptionPreset("Basic") + } + > + + Basic + +
+ +
+ setCaptionPreset("REVID") + } + > + + REVID + +
+ +
+ setCaptionPreset("Hormozi") + } + > + + Hormozi + +
+ +
+ setCaptionPreset("Ali") + } + > + + Ali + +
+ +
+ setCaptionPreset("Wrap 1") + } + > + + + Wrap 1 + +
+ +
+ setCaptionPreset("Wrap 2") + } + > + + + Wrap 2 + +
+ +
+ setCaptionPreset("Faceless") + } + > + + Faceless + +
+
+ +
+
+ {t("alignment")} +
+
+ +
+
+ setCaptionPosition("top") + } + className={classNames( + "flex items-center justify-center p-2 border border-base-200 text-xs transition-all bg-white hover:bg-white rounded-lg cursor-pointer gap-1 normal-case text-black/50 hover:text-black", + { + "border-secondary hover:border-secondary": + captionPosition === + "top", + } + )} + > + + {t("top")} +
+
+ setCaptionPosition("middle") + } + className={classNames( + "flex items-center justify-center p-2 border border-base-200 text-xs transition-all bg-white hover:bg-white rounded-lg cursor-pointer gap-1 normal-case text-black/50 hover:text-black", + { + "border-secondary hover:border-secondary": + captionPosition === + "middle", + } + )} + > + + {t("middle")} +
+ +
+ setCaptionPosition("bottom") + } + className={classNames( + "flex items-center justify-center p-2 border border-base-200 text-xs transition-all bg-white hover:bg-white rounded-lg cursor-pointer gap-1 normal-case text-black/50 hover:text-black", + { + "border-secondary hover:border-secondary": + captionPosition === + "bottom", + } + )} + > + + {t("bottom")} +
+
+ + )} +
+
+
+
+
+ +
+ + {t("originalPrice")}{" "} + 30{t("credits")} + + + {t("currentPrice")}{" "} + + 20 {t("additionalCredits")} 10{" "} + {t("additionalCreditsEnd")} + + +
+
+ + ); +} diff --git a/src/ui/(console)/create/components/video.tsx b/src/ui/(console)/create/components/video.tsx new file mode 100644 index 0000000..33b8602 --- /dev/null +++ b/src/ui/(console)/create/components/video.tsx @@ -0,0 +1,317 @@ +import React, { useEffect, useState } from "react"; +import useFetch from "@/hooks/useFetch"; +import classNames from "classnames"; +import * as Collapsible from "@radix-ui/react-collapsible"; +import * as Tabs from "@radix-ui/react-tabs"; +import { IoChevronDown, IoPlay, IoPause } from "react-icons/io5"; +import { useTranslations, useLocale } from "next-intl"; +import { GetSpeakersData } from "@/apis/auth"; +// 定义接口 +export interface VideoData { + language: string; + videoSelect: string; + style: string; +} + +export default function VideoSelect({ + onChange, +}: { + onChange: (data: VideoData) => void; +}) { + const t = useTranslations("video"); + + const locale = useLocale(); + // const [speakersData, setSpeakersData] = useState([]); + const { + data: speakersData, + loading: speakersLoading, + error: speakersError, + fetchData: fetchSpeakers, + } = useFetch({ + url: "/api/get_speakers/", + method: "GET", + cacheTime: 0, + }); + + const [videoFormState, setVideoFormState] = useState({ + language: "zh-CN", // 国家语种 + videoSelect: "", // 讲话人 + style: "", // 讲话风格 + }); + + const [currentVideo, setCurrentVideo] = useState({}); // 当前讲话人对象 + const [isPlaying, setIsPlaying] = useState(null); // 当前播放的音频标识 + const [audio, setAudio] = useState(null); // 音频对象 + + // GetSpeakersData().then((res) => { + // console.log("res", res); + // setSpeakersData(res.data); + // videoChange(res.data[0].讲话人[0]); + // }); + useEffect(() => { + fetchSpeakers() + .then((res) => { + console.log("Fetched speakers data:", res); + videoChange(res[0].讲话人[0]); + }) + .catch((err) => { + console.error("Failed to fetch speakers data:", err); + }); + }, []); + + const languageChange = (val: string) => { + const selectedLanguage = getLanguageSpeaker(val); + const video = selectedLanguage.讲话人[0]; + const newState = { + language: val, + videoSelect: video.讲话人英文参数, + style: video.风格列表.length > 0 ? video.风格列表[0].英文参数 : "", + }; + setVideoFormState(newState); + setCurrentVideo(video); // 设置当前讲话人 + }; + + const getLanguageSpeaker = (language: string) => { + return speakersData.find((item) => item.语言参数 === language); + }; + + const videoChange = (item: any) => { + const newState = { + ...videoFormState, + videoSelect: item.讲话人英文参数, + style: item.风格列表.length > 0 ? item.风格列表[0].英文参数 : "", + }; + setVideoFormState(newState); + setCurrentVideo(item); // 设置当前讲话人 + }; + + useEffect(() => { + console.log("videoFormState", videoFormState); + onChange(videoFormState); + }, [videoFormState, onChange]); + + const handleToggle = (index) => { + setOpenStates((prevState) => ({ + ...prevState, + [index]: !prevState[index], // 切换对应 index 的 open 状态 + })); + }; + + const [openStates, setOpenStates] = useState({}); // 为每个 Collapsible 创建独立的 open 状态 + + const handlePlay = (audioUrl: string) => { + // 先停止当前播放的音频 + if (audio) { + audio.pause(); + audio.currentTime = 0; // 将音频重置到开头 + } + + // 播放新音频 + const newAudio = new Audio(audioUrl); + setAudio(newAudio); + setIsPlaying(audioUrl); + newAudio.play(); + + newAudio.onended = () => { + setIsPlaying(null); + }; + }; + + return ( + +
{t("language")}
+ + {speakersData && + speakersData.map((item, index) => ( + + {t(item.语言参数)} + + ))} + + {speakersData && + speakersData.map((item, index) => ( + +
+
{t("speaker")}
+
+ {item.讲话人 + .slice(0, 6) + .map((speakItem, speakIndex) => ( +
+ videoChange(speakItem) + } + > +
+
+
+ {speakItem.讲话人中文名} +
+
+
+
+ ))} +
+ handleToggle(index)} + > +
+ {item.讲话人.length > 6 && ( + + + + )} + {item.讲话人.length > 6 && ( + +
+ {item.讲话人 + .slice(6) + .map( + ( + speakItem, + speakIndex + ) => ( +
+ videoChange( + speakItem + ) + } + > +
+
+
+
+ { + speakItem.讲话人中文名 + } +
+
+
+
+
+ ) + )} +
+
+ )} +
+
+
+
+
{t("speakingStyle")}
+
+
+ {JSON.stringify(currentVideo) !== "{}" && + currentVideo.风格列表.map( + (styleItem, styleIndex) => { + const audioUrl = `/audio/${videoFormState.videoSelect}_${styleItem.英文参数}.mp3`; // 假设音频文件存放在 public/audio 目录中 + return ( + + ); + } + )} +
+
+
+
+ ))} +
+ ); +} diff --git a/src/ui/(console)/create/create-tabs.tsx b/src/ui/(console)/create/create-tabs.tsx new file mode 100644 index 0000000..ee458d6 --- /dev/null +++ b/src/ui/(console)/create/create-tabs.tsx @@ -0,0 +1,128 @@ +"use client"; + +import * as Tabs from "@radix-ui/react-tabs"; +import { Component, useState } from "react"; +import classNames from "classnames"; +import Tiktok from "./tiktok"; +import Avatar from "./avatar"; +import Music from "./music"; +import TextVideo from "./textVideo"; +import ImageVideo from "./imageVideo"; +import { useTranslations } from "next-intl"; +export default function CreateTabs() { + const t = useTranslations("createTabs"); + const [tabVal, setTabVal] = useState("text"); + const tabsChange = (val: string) => { + setTabVal(val); + }; + const getVideoTempUrl = (val: string) => { + for (let i of tabs) { + if (i.value === val) { + return i.videoTemp; + } + } + }; + const tabs = [ + { + name: t("aiTextVideoGenerator"), + value: "text", + component: , + videoTemp: "/video/img-to-video/cn/demo_video.webm", + + }, + { + name: t("aiImageVideoGenerator"), + value: "image", + component: , + videoTemp: "/video/img-to-video/cn/demo_image.webm", + }, + { + name: t("aiTiktokVideoGenerator"), + value: "tiktok", + component: , + videoTemp: + "/video/create-tiktok-video/en/demo_video.webm", + ImageTemp: + "/video/create-tiktok-video/en/demo_demo.webm", + }, + { + name: t("aiTalkingAvatarVideoCreator"), + value: "avatar", + component: , + videoTemp: + "/video/create-Avatar-video/en/demo_video.webm", + ImageTemp: + "/video/create-Avatar-video/en/demo_video.webm", + }, + { + name: t("aiMusicVideoGenerator"), + value: "music", + component: , + videoTemp: + "/video/music-to-video/cn/demo_video.webm", + ImageTemp: + "/video/music-to-video/cn/demo_video.webm", + }, + ]; + + return ( + + + {tabs.map((item, index) => { + return ( + + + {item.name} + + + ); + })} + +
+
+ {tabs.map((item, index) => { + return ( + +
+ {item.component} +
+
+ ); + })} +
+
+
+
+ +
+
+
+
+ ); +} diff --git a/src/ui/(console)/create/imageVideo/index.module.css b/src/ui/(console)/create/imageVideo/index.module.css new file mode 100644 index 0000000..d3da5cf --- /dev/null +++ b/src/ui/(console)/create/imageVideo/index.module.css @@ -0,0 +1,38 @@ +.stroke-text { + font-weight: bold; + text-transform: uppercase; + color: white; + position: relative; + display: inline-block; + z-index: 1; +} + +.stroke-text:after, .stroke-text:before { + content: attr(data-text); + position: absolute; + height: 100%; + width: 100%; + -webkit-text-stroke: .2em #000; + z-index: -1; /* 确保它们位于主文本前 */ +} +.stroke-text:after{ + left: .05em; + top: .05em; +} +.stroke-text:before{ + left: 0; + top: 0; +} + +.glow-text-effect{ + color: var(--text-color, #4ade80); + text-shadow: 0 0 .3em rgba(0, 0, 0, .7), 0 0 .05em var(--text-color, #4ade80), 0 0 .1em var(--text-color, #4ade80), 0 0 .15em var(--text-color, #4ade80), 0 0 .2em var(--text-color, #4ade80), 0 0 .25em var(--text-color, #4ade80); +} +.bevel-text-effect { + display: inline-flex; + position: relative; + color: var(--text-color, #4ade80); + -webkit-text-stroke: .025em var(--text-color, #4ade80); + -webkit-text-fill-color: transparent; + text-shadow: 0 .025em .0375em var(--text-color, #4ade80), 0 0 0 #fff; +} \ No newline at end of file diff --git a/src/ui/(console)/create/imageVideo/index.tsx b/src/ui/(console)/create/imageVideo/index.tsx new file mode 100644 index 0000000..1abdb5e --- /dev/null +++ b/src/ui/(console)/create/imageVideo/index.tsx @@ -0,0 +1,289 @@ +import InputBox from "@/components/InputBox"; +import { useToast } from "@/contexts/ToastContext"; +import useFetch from "@/hooks/useFetch"; +import classNames from "classnames"; +import { use, useEffect, useState } from "react"; +import useLoadingStore from "@/store/loadingStore"; +import { useRouter } from "next/navigation"; +import { Field, Label, Radio, RadioGroup } from "@headlessui/react"; +import { useTranslations } from "next-intl"; +import Image from "next/image"; +import UploadImage from "@/components/UploadImage"; +const models = ["gen2", "gen3"]; +const ratios = [ + { + label: "16:9", + id: 1, + value: { + width: 1920, + height: 1080, + }, + model: ["gen2", "gen3"], + }, + { + label: "9:16", + id: 2, + value: { + width: 1080, + height: 1920, + }, + model: ["gen2"], + + tooltip: "仅在Gen2模型下支持9:16", + }, + { + label: "1:1", + id: 3, + value: { + width: 1080, + height: 1080, + }, + model: ["gen2"], + tooltip: "仅在Gen2模型下支持1:1", + }, +]; +const times = [ + { + label: "4s", + id: 1, + value: 4, + model: "gen2", + tooltip: "仅在Gen2模型下支持4s", + }, + { + label: "5s", + id: 2, + value: 5, + model: "gen3", + tooltip: "仅在Gen3模型下支持5s", + }, + { + label: "10s", + id: 3, + value: 10, + model: "gen3", + tooltip: "仅在Gen3模型下支持10s", + }, +]; + +export default function ImageVideo() { + const router = useRouter(); + const t = useTranslations("tiktok"); + const { addToast, addToastSuccess, addToastError } = useToast(); + const [rate, setRate] = useState(5); + let [model, setModel] = useState(models[0]); + + const showLoading = useLoadingStore((state) => state.showLoading); + const hideLoading = useLoadingStore((state) => state.hideLoading); + + const { + fetchData: createFetch, + loading: createLoading, + data: createResult, + } = useFetch({ + url: "/api/text-to-video/", + method: "POST", + }); + const create = () => { + const requestData = { + text_prompt: text, + model: model, + time: time.value, + motion: rate, + image_url: imageUrl, + }; + if (text === "") { + addToastError(t("enterVideoText")); + return; + } + if (imageUrl === "") { + addToastError(t("uploadAvatarImage")); + return; + } + console.log("requestData", requestData); + showLoading("creating..."); + createFetch(requestData) + .then((res) => { + addToastSuccess(t("createSuccess")); + router.push("/projects"); + }) + .finally(() => { + hideLoading(); + }); + }; + + const [time, setTime] = useState(times[0]); + const [text, setText] = useState(""); + + const [imageUrl, setImageUrl] = useState(""); + const handleImageDataChange = (imageUrl: string) => { + setImageUrl(imageUrl); + }; + const modelChange = (e) => { + setModel(e); + if (!time.model !== e) { + for (let i of times) { + if (i.model === e) { + setTime(i); + break; + } + } + } + }; + + return ( + <> +

{t("useTool")}

+ + + + {t("videoTextTip")} + + + + + + +
+
+
+
+ {t("selectionModel")} +
+ {/*
+ {t("dynamicOrVideo")} +
*/} +
+
+ + {models.map((model) => ( + + +
+ +
+ +
+
+ ))} +
+
+
+
+
+
+ {t("creativeImagination")} +
+
+ {/* {t("adaptScreenRatio")} */} + {t("creativityProgressBar")} +
+
+
+
+ + setRate(Number(e.target.value)) + } + /> +
+
+ | + | + | + | + | + | + | + | + | + | + | +
+
+
+
+
+
+ {t("selectVideoDuration")} +
+ {/*
+ 选择视频时长 +
*/} +
+
+ +
+ {times.map((time) => ( + + + + + + {time.model !== model && ( +
+ {time.tooltip} +
+
+ )} +
+ ))} +
+
+
+
+
+
+
+ +
+ + {t("originalPrice")}{" "} + 20{t("credits")} + + + {t("currentPrice")} 10 {t("credits")} + +
+
+ + ); +} diff --git a/src/ui/(console)/create/music/index.module.css b/src/ui/(console)/create/music/index.module.css new file mode 100644 index 0000000..d3da5cf --- /dev/null +++ b/src/ui/(console)/create/music/index.module.css @@ -0,0 +1,38 @@ +.stroke-text { + font-weight: bold; + text-transform: uppercase; + color: white; + position: relative; + display: inline-block; + z-index: 1; +} + +.stroke-text:after, .stroke-text:before { + content: attr(data-text); + position: absolute; + height: 100%; + width: 100%; + -webkit-text-stroke: .2em #000; + z-index: -1; /* 确保它们位于主文本前 */ +} +.stroke-text:after{ + left: .05em; + top: .05em; +} +.stroke-text:before{ + left: 0; + top: 0; +} + +.glow-text-effect{ + color: var(--text-color, #4ade80); + text-shadow: 0 0 .3em rgba(0, 0, 0, .7), 0 0 .05em var(--text-color, #4ade80), 0 0 .1em var(--text-color, #4ade80), 0 0 .15em var(--text-color, #4ade80), 0 0 .2em var(--text-color, #4ade80), 0 0 .25em var(--text-color, #4ade80); +} +.bevel-text-effect { + display: inline-flex; + position: relative; + color: var(--text-color, #4ade80); + -webkit-text-stroke: .025em var(--text-color, #4ade80); + -webkit-text-fill-color: transparent; + text-shadow: 0 .025em .0375em var(--text-color, #4ade80), 0 0 0 #fff; +} \ No newline at end of file diff --git a/src/ui/(console)/create/music/index.tsx b/src/ui/(console)/create/music/index.tsx new file mode 100644 index 0000000..d1558f9 --- /dev/null +++ b/src/ui/(console)/create/music/index.tsx @@ -0,0 +1,589 @@ +import InputBox from "@/components/InputBox"; +import ListBox from "@/components/ListBox"; +import { useToast } from "@/contexts/ToastContext"; +import useFetch from "@/hooks/useFetch"; +import classNames from "classnames"; +import { use, useEffect, useState } from "react"; +import { MdCheckCircle } from "react-icons/md"; +import VideoSelect, { VideoData } from "../components/video"; +import useUserStore from "@/store/userStore"; +import useLoadingStore from "@/store/loadingStore"; +import { useRouter } from "next/navigation"; +import UploadImage from "@/components/UploadImage"; +import styles from "./index.module.css"; +import { Switch } from "@headlessui/react"; +import { + PiAlignTopSimple, + PiAlignCenterVerticalSimple, + PiAlignBottomSimple, +} from "react-icons/pi"; +import UploadAudio from "@/components/UploadAudio"; +import { useTranslations } from "next-intl"; +export default function Music() { + const router = useRouter(); + const t = useTranslations("tiktok"); + const { addToast, addToastSuccess, addToastError } = useToast(); + const [enabledCaptions, setEnabledCaptions] = useState(false); + + const ratioList = [ + { + name: "16 / 9", + id: 1, + value: "16 / 9", + }, + { + name: "1 / 1", + id: 2, + value: "1 / 1", + }, + { + name: "9 / 16", + id: 3, + value: "9 / 16", + }, + ]; + const showLoading = useLoadingStore((state) => state.showLoading); + const hideLoading = useLoadingStore((state) => state.hideLoading); + + const { + fetchData: createFetch, + loading: createLoading, + data: createResult, + } = useFetch({ + url: "/api/create-music-video/", + method: "POST", + }); + const create = () => { + const requestData = { + ratio: ratio.value, + mediaType: mediaType.value, + audioUrl: audioUrl, + slug: "music-to-video", + }; + if (audioUrl === "") { + addToastError(t("uploadAudio")); + return; + } + if (enabledCaptions) { + requestData["captionPreset"] = captionPreset; + requestData["captionPosition"] = captionPosition; + } + console.log("requestData", requestData); + showLoading("creating..."); + createFetch(requestData) + .then((res) => { + console.log("create result:", res); + if (res.success === 1) { + addToastSuccess(t("createSuccess")); + router.push("/projects"); + } else { + addToastError(t("createFailed")); + } + }) + .finally(() => { + hideLoading(); + }); + }; + + const [ratio, setRatio] = useState(ratioList[0]); + + const [captionPreset, setCaptionPreset] = useState("Wrap 1"); + + const [captionPosition, setCaptionPosition] = useState("bottom"); + const mediaTypeList = [ + { id: 1, name: t("stockVideo"), value: "stockVideo" }, + { id: 2, name: t("movingImage"), value: "movingImage" }, + ]; + + const [mediaType, setMediaType] = useState(mediaTypeList[1]); + + const [videoData, setVideoData] = useState({ + language: "", // 国家语种 + videoSelect: "", // 讲话人 + style: "", // 讲话风格 + }); + const handleVideoDataChange = (newData: VideoData) => { + setVideoData(newData); + }; + const [audioUrl, setAudioUrl] = useState(""); + const handleAudioDataChange = (audioUrl: string) => { + setAudioUrl(audioUrl); + }; + + const useinfo = useUserStore((state) => state.user); + + return ( + <> + + + {/* + 💡 Tip: use short, punctuated sentences. + */} + + + +
+
+
+ +
+
+
+
+ {t("selectFootageType")} +
+
+ {t("dynamicOrVideo")} +
+
+
+
+
+
+ +
+
+
+
+ {t("chooseScreenRatio")} +
+
+ {t("adaptScreenRatio")} +
+
+
+
+ +
+
+
+
+ + + +
+ 是否开启字幕 +
+
+ {enabledCaptions && ( + <> +
+
+ {t("selectPreset")} +
+
+ +
+
+ setCaptionPreset("Basic") + } + > + + Basic + +
+ +
+ setCaptionPreset("REVID") + } + > + + REVID + +
+ +
+ setCaptionPreset("Hormozi") + } + > + + Hormozi + +
+ +
+ setCaptionPreset("Ali") + } + > + + Ali + +
+ +
+ setCaptionPreset("Wrap 1") + } + > + + + Wrap 1 + +
+ +
+ setCaptionPreset("Wrap 2") + } + > + + + Wrap 2 + +
+ +
+ setCaptionPreset("Faceless") + } + > + + Faceless + +
+
+ +
+
+ {t("alignment")} +
+
+ +
+
+ setCaptionPosition("top") + } + className={classNames( + "flex items-center justify-center p-2 border border-base-200 text-xs transition-all bg-white hover:bg-white rounded-lg cursor-pointer gap-1 normal-case text-black/50 hover:text-black", + { + "border-secondary hover:border-secondary": + captionPosition === + "top", + } + )} + > + + {t("top")} +
+
+ setCaptionPosition("middle") + } + className={classNames( + "flex items-center justify-center p-2 border border-base-200 text-xs transition-all bg-white hover:bg-white rounded-lg cursor-pointer gap-1 normal-case text-black/50 hover:text-black", + { + "border-secondary hover:border-secondary": + captionPosition === + "middle", + } + )} + > + + {t("middle")} +
+ +
+ setCaptionPosition("bottom") + } + className={classNames( + "flex items-center justify-center p-2 border border-base-200 text-xs transition-all bg-white hover:bg-white rounded-lg cursor-pointer gap-1 normal-case text-black/50 hover:text-black", + { + "border-secondary hover:border-secondary": + captionPosition === + "bottom", + } + )} + > + + {t("bottom")} +
+
+ + )} +
+
+
+
+
+ +
+ + {t("originalPrice")}{" "} + 50{t("credits")} + + + {t("currentPrice")} 30 {t("credits")} + +
+
+ + ); +} diff --git a/src/ui/(console)/create/review.tsx b/src/ui/(console)/create/review.tsx new file mode 100644 index 0000000..c61217e --- /dev/null +++ b/src/ui/(console)/create/review.tsx @@ -0,0 +1,3 @@ +export default function Review() { + return <>网站评论视频; +} diff --git a/src/ui/(console)/create/textVideo/index.module.css b/src/ui/(console)/create/textVideo/index.module.css new file mode 100644 index 0000000..d3da5cf --- /dev/null +++ b/src/ui/(console)/create/textVideo/index.module.css @@ -0,0 +1,38 @@ +.stroke-text { + font-weight: bold; + text-transform: uppercase; + color: white; + position: relative; + display: inline-block; + z-index: 1; +} + +.stroke-text:after, .stroke-text:before { + content: attr(data-text); + position: absolute; + height: 100%; + width: 100%; + -webkit-text-stroke: .2em #000; + z-index: -1; /* 确保它们位于主文本前 */ +} +.stroke-text:after{ + left: .05em; + top: .05em; +} +.stroke-text:before{ + left: 0; + top: 0; +} + +.glow-text-effect{ + color: var(--text-color, #4ade80); + text-shadow: 0 0 .3em rgba(0, 0, 0, .7), 0 0 .05em var(--text-color, #4ade80), 0 0 .1em var(--text-color, #4ade80), 0 0 .15em var(--text-color, #4ade80), 0 0 .2em var(--text-color, #4ade80), 0 0 .25em var(--text-color, #4ade80); +} +.bevel-text-effect { + display: inline-flex; + position: relative; + color: var(--text-color, #4ade80); + -webkit-text-stroke: .025em var(--text-color, #4ade80); + -webkit-text-fill-color: transparent; + text-shadow: 0 .025em .0375em var(--text-color, #4ade80), 0 0 0 #fff; +} \ No newline at end of file diff --git a/src/ui/(console)/create/textVideo/index.tsx b/src/ui/(console)/create/textVideo/index.tsx new file mode 100644 index 0000000..c261fe5 --- /dev/null +++ b/src/ui/(console)/create/textVideo/index.tsx @@ -0,0 +1,474 @@ +import InputBox from "@/components/InputBox"; +import { useToast } from "@/contexts/ToastContext"; +import useFetch from "@/hooks/useFetch"; +import classNames from "classnames"; +import { use, useEffect, useState } from "react"; +import useLoadingStore from "@/store/loadingStore"; +import { useRouter } from "next/navigation"; +import { Field, Label, Radio, RadioGroup } from "@headlessui/react"; +import { useTranslations } from "next-intl"; +import Image from "next/image"; + +const models = ["gen2", "gen3"]; +const ratios = [ + { + label: "16:9", + id: 1, + value: { + width: 1920, + height: 1080, + }, + model: ["gen2", "gen3"], + }, + { + label: "9:16", + id: 2, + value: { + width: 1080, + height: 1920, + }, + model: ["gen2"], + + tooltip: "仅在Gen2模型下支持9:16", + }, + { + label: "1:1", + id: 3, + value: { + width: 1080, + height: 1080, + }, + model: ["gen2"], + tooltip: "仅在Gen2模型下支持1:1", + }, +]; +const times = [ + { + label: "4s", + id: 1, + value: 4, + model: "gen2", + tooltip: "仅在Gen2模型下支持4s", + }, + { + label: "5s", + id: 2, + value: 5, + model: "gen3", + tooltip: "仅在Gen3模型下支持5s", + }, + { + label: "10s", + id: 3, + value: 10, + model: "gen3", + tooltip: "仅在Gen3模型下支持10s", + }, +]; + +const styles = [ + { + name: "", + image: "/images/default.jpg", + label: "默认", + }, + { + name: "abandoned", + image: "/images/abandoned.jpg", + label: "废弃", + }, + { + name: "abstract_sculpture", + image: "/images/abstract_sculpture.jpg", + label: "抽象", + }, + { + name: "advertising", + image: "/images/advertising.jpg", + label: "广告", + }, + { + name: "anime", + image: "/images/anime.jpg", + label: "动漫", + }, + { + name: "cine_lens", + image: "/images/cine_lens.jpg", + label: "电影镜头", + }, + { + name: "cinematic", + image: "/images/cinematic.jpg", + label: "电影", + }, + { + name: "concept_art", + image: "/images/concept_art.jpg", + label: "艺术", + }, + { + name: "forestpunk", + image: "/images/forestpunk.jpg", + label: "赛博朋克", + }, + { + name: "frost", + image: "/images/frost.jpg", + label: "雪", + }, + { + name: "graphite", + image: "/images/graphite.jpg", + label: "石墨", + }, + { + name: "macro_photography", + image: "/images/macro_photography.jpg", + label: "宏观", + }, + { + name: "pixel_art", + image: "/images/pixel_art.jpg", + label: "像素艺术", + }, + { + name: "retro_photography", + image: "/images/retro_photography.jpg", + label: "复古", + }, + { + name: "sci_fi_art", + image: "/images/sci_fi_art.jpg", + label: "科幻", + }, + { + name: "thriller", + image: "/images/thriller.jpg", + label: "惊悚", + }, + { + name: "35mm", + image: "/images/35mm.jpg", + label: "35mm", + }, + // { + // name: "vector", + // image: "https://www.typeframes.com/_next/image?url=%2Fpresets%2FLEONARDO.webp&w=256&q=75", + // label: "矢量", + // }, + // { + // name: "watercolor", + // image: "https://www.typeframes.com/_next/image?url=%2Fpresets%2FLEONARDO.webp&w=256&q=75", + // label: "水彩", + // }, +]; + +export default function TextVideo() { + const router = useRouter(); + const t = useTranslations("tiktok"); + const s = useTranslations("style"); + const { addToast, addToastSuccess, addToastError } = useToast(); + const [rate, setRate] = useState(5); + let [model, setModel] = useState(models[0]); + const [selectedStyle, setSelectedStyle] = useState(""); // 默认风格为空 + + const showLoading = useLoadingStore((state) => state.showLoading); + const hideLoading = useLoadingStore((state) => state.hideLoading); + + const { + fetchData: createFetch, + loading: createLoading, + data: createResult, + } = useFetch({ + url: "/api/text-to-video/", + method: "POST", + }); + const create = () => { + const requestData = { + text_prompt: text, + model: model, + time: time.value, + style: selectedStyle, + motion: rate, + }; + if (text === "") { + addToastError(t("enterVideoText")); + return; + } + if (model === "gen2") { + requestData["width"] = ratio.value.width; + requestData["height"] = ratio.value.height; + } + console.log("requestData", requestData); + showLoading("creating..."); + createFetch(requestData) + .then((res) => { + addToastSuccess(t("createSuccess")); + router.push("/projects"); + }) + .finally(() => { + hideLoading(); + }); + }; + + const [ratio, setRatio] = useState(ratios[0]); + const [time, setTime] = useState(times[0]); + const [text, setText] = useState(""); + + const modelChange = (e) => { + setModel(e); + if (!ratio.model.includes(e)) { + for (let i of ratios) { + if (i.model.includes(e)) { + setRatio(i); + break; + } + } + } + if (!time.model !== e) { + for (let i of times) { + if (i.model === e) { + setTime(i); + break; + } + } + } + }; + + return ( + <> +

{t("useTool")}

+ + + + {t("videoTextTip")} + + + +
+
+ {styles.map((style, index) => ( +
setSelectedStyle(style.name)} // 选择风格 + > +
+ {s(style.name)} +
+ {style.name} +
+ ))} +
+
+
+ +
+
+
+
+ {t("selectionModel")} +
+ {/*
+ {t("dynamicOrVideo")} +
*/} +
+
+ + {models.map((model) => ( + + +
+ +
+ +
+
+ ))} +
+
+
+
+
+
+ {t("chooseScreenRatio")} +
+
+ {t("adaptScreenRatio")} +
+
+
+ +
+ {ratios.map((ratio) => ( + + +
+
+ + {!ratio.model.includes(model) && ( +
+ {ratio.tooltip} +
+
+ )} +
+ ))} +
+
+
+
+
+
+
+ {t("creativeImagination")} +
+
+ {t("creativityProgressBar")} +
+
+
+
+ + setRate(Number(e.target.value)) + } + /> +
+
+ | + | + | + | + | + | + | + | + | + | + | +
+
+
+
+
+
+ {t("selectVideoDuration")} +
+ {/*
+ 选择视频时长 +
*/} +
+
+ +
+ {times.map((time) => ( + + + + + + {time.model !== model && ( +
+ {time.tooltip} +
+
+ )} +
+ ))} +
+
+
+
+
+
+
+ +
+ + {t("originalPrice")}{" "} + 20{t("credits")} + + + {t("currentPrice")} 10 {t("credits")} + +
+
+ + ); +} diff --git a/src/ui/(console)/create/tiktok/index.module.css b/src/ui/(console)/create/tiktok/index.module.css new file mode 100644 index 0000000..d3da5cf --- /dev/null +++ b/src/ui/(console)/create/tiktok/index.module.css @@ -0,0 +1,38 @@ +.stroke-text { + font-weight: bold; + text-transform: uppercase; + color: white; + position: relative; + display: inline-block; + z-index: 1; +} + +.stroke-text:after, .stroke-text:before { + content: attr(data-text); + position: absolute; + height: 100%; + width: 100%; + -webkit-text-stroke: .2em #000; + z-index: -1; /* 确保它们位于主文本前 */ +} +.stroke-text:after{ + left: .05em; + top: .05em; +} +.stroke-text:before{ + left: 0; + top: 0; +} + +.glow-text-effect{ + color: var(--text-color, #4ade80); + text-shadow: 0 0 .3em rgba(0, 0, 0, .7), 0 0 .05em var(--text-color, #4ade80), 0 0 .1em var(--text-color, #4ade80), 0 0 .15em var(--text-color, #4ade80), 0 0 .2em var(--text-color, #4ade80), 0 0 .25em var(--text-color, #4ade80); +} +.bevel-text-effect { + display: inline-flex; + position: relative; + color: var(--text-color, #4ade80); + -webkit-text-stroke: .025em var(--text-color, #4ade80); + -webkit-text-fill-color: transparent; + text-shadow: 0 .025em .0375em var(--text-color, #4ade80), 0 0 0 #fff; +} \ No newline at end of file diff --git a/src/ui/(console)/create/tiktok/index.tsx b/src/ui/(console)/create/tiktok/index.tsx new file mode 100644 index 0000000..9fa3626 --- /dev/null +++ b/src/ui/(console)/create/tiktok/index.tsx @@ -0,0 +1,640 @@ +import InputBox from "@/components/InputBox"; +import ListBox from "@/components/ListBox"; +import { useToast } from "@/contexts/ToastContext"; +import useFetch from "@/hooks/useFetch"; +import classNames from "classnames"; +import { useState } from "react"; +import VideoSelect, { VideoData } from "../components/video"; +import useLoadingStore from "@/store/loadingStore"; +import { useRouter } from "next/navigation"; +import styles from "./index.module.css"; +import { useTranslations } from "next-intl"; +import { Switch } from "@headlessui/react"; +import { + PiAlignTopSimple, + PiAlignCenterVerticalSimple, + PiAlignBottomSimple, +} from "react-icons/pi"; + +export default function Tiktok() { + const t = useTranslations("tiktok"); + + const router = useRouter(); + + const { addToast, addToastSuccess, addToastError } = useToast(); + const [rate, setRate] = useState(0.1); + const [enabledCaptions, setEnabledCaptions] = useState(false); + const ratioList = [ + { + name: "16 / 9", + id: 1, + value: "16 / 9", + }, + { + name: "1 / 1", + id: 2, + value: "1 / 1", + }, + { + name: "9 / 16", + id: 3, + value: "9 / 16", + }, + ]; + const showLoading = useLoadingStore((state) => state.showLoading); + const hideLoading = useLoadingStore((state) => state.hideLoading); + + const { + fetchData: createFetch, + loading: createLoading, + data: createResult, + } = useFetch({ + url: "/api/create-tiktok-video/", + method: "POST", + }); + const create = () => { + const requestData = { + text: text, + voice: videoData.videoSelect, + style: videoData.style, + ratio: ratio.value, + rate: rate, + mediaType: mediaType.value, + slug: "create-tiktok-video", + disableCaptions: !enabledCaptions, + }; + if (enabledCaptions) { + requestData["captionPreset"] = captionPreset; + requestData["captionPosition"] = captionPosition; + } + console.log(requestData); + if (text === "") { + addToastError(t("enterVideoText")); + return; + } + console.log("requestData", requestData); + showLoading("creating..."); + createFetch(requestData) + .then((res) => { + console.log("create result:", res); + if (res.success === 1) { + addToastSuccess(t("createSuccess")); + router.push("/projects"); + } else { + addToastError(t("createFailed")); + } + }) + .finally(() => { + hideLoading(); + }); + }; + + const [ratio, setRatio] = useState(ratioList[0]); + + const [captionPreset, setCaptionPreset] = useState("Wrap 1"); + + const [captionPosition, setCaptionPosition] = useState("bottom"); + const mediaTypeList = [ + { id: 1, name: t("stockVideo"), value: "stockVideo" }, + { id: 2, name: t("movingImage"), value: "movingImage" }, + ]; + + const [mediaType, setMediaType] = useState(mediaTypeList[1]); + + const [videoData, setVideoData] = useState({ + language: "", // 国家语种 + videoSelect: "", // 讲话人 + style: "", // 讲话风格 + }); + const handleVideoDataChange = (newData: VideoData) => { + setVideoData(newData); + }; + + const [text, setText] = useState(""); + + return ( + <> +

{t("useTool")}

+ + + + {t("videoTextTip")} + + + + {/* + {t("voicePunctuationTip")} + */} + + + +
+
+
+ +
+
+
+
+ {t("selectFootageType")} +
+
+ {t("dynamicOrVideo")} +
+
+
+
+
+
+ +
+
+
+
+ {t("chooseScreenRatio")} +
+
+ {t("adaptScreenRatio")} +
+
+
+
+
+
+ + setRate(Number(e.target.value)) + } + /> +
+
+ | + | + | + | + | + | + | + | + | + | +
+
+
+
+ {t("chooseSpeakerSpeek")} +
+
+ {t("chooseSpeakerSpeekIntro")} +
+
+
+
+ +
+
+
+
+ + + +
+ {t("enabledCaptions")} +
+
+ {enabledCaptions && ( + <> +
+
+ {t("selectPreset")} +
+
+ +
+
+ setCaptionPreset("Basic") + } + > + + Basic + +
+ +
+ setCaptionPreset("REVID") + } + > + + REVID + +
+ +
+ setCaptionPreset("Hormozi") + } + > + + Hormozi + +
+ +
+ setCaptionPreset("Ali") + } + > + + Ali + +
+ +
+ setCaptionPreset("Wrap 1") + } + > + + + Wrap 1 + +
+ +
+ setCaptionPreset("Wrap 2") + } + > + + + Wrap 2 + +
+ +
+ setCaptionPreset("Faceless") + } + > + + Faceless + +
+
+ +
+
+ {t("alignment")} +
+
+ +
+
+ setCaptionPosition("top") + } + className={classNames( + "flex items-center justify-center p-2 border border-base-200 text-xs transition-all bg-white hover:bg-white rounded-lg cursor-pointer gap-1 normal-case text-black/50 hover:text-black", + { + "border-secondary hover:border-secondary": + captionPosition === + "top", + } + )} + > + + {t("top")} +
+
+ setCaptionPosition("middle") + } + className={classNames( + "flex items-center justify-center p-2 border border-base-200 text-xs transition-all bg-white hover:bg-white rounded-lg cursor-pointer gap-1 normal-case text-black/50 hover:text-black", + { + "border-secondary hover:border-secondary": + captionPosition === + "middle", + } + )} + > + + {t("middle")} +
+ +
+ setCaptionPosition("bottom") + } + className={classNames( + "flex items-center justify-center p-2 border border-base-200 text-xs transition-all bg-white hover:bg-white rounded-lg cursor-pointer gap-1 normal-case text-black/50 hover:text-black", + { + "border-secondary hover:border-secondary": + captionPosition === + "bottom", + } + )} + > + + {t("bottom")} +
+
+ + )} +
+
+
+
+
+ +
+ + {t("originalPrice")}{" "} + 30{t("credits")} + + + {t("currentPrice")}{" "} + + 20 {t("additionalCredits")} 10{" "} + {t("additionalCreditsEnd")} + + +
+
+ + ); +} diff --git a/src/ui/(console)/projects/video-item.tsx b/src/ui/(console)/projects/video-item.tsx new file mode 100644 index 0000000..881a2af --- /dev/null +++ b/src/ui/(console)/projects/video-item.tsx @@ -0,0 +1,116 @@ +import Link from "next/link"; +import { IoEllipsisHorizontal } from "react-icons/io5"; +import { useTranslations } from "next-intl"; +import useFetch from "@/hooks/useFetch"; +import { useEffect } from "react"; + +export default function VideoItem({ item }) { + const t = useTranslations("videoItem"); // 使用翻译 + + const getStatusBadge = (status) => { + switch (status) { + case "completed": + return t("completed"); + case "failed": + return t("failed"); + case "Pending": + case "pending": + return t("pending"); + case "in_progress": + return t("inProgress"); + default: + return status; + } + }; + + return ( + <> +
+
+
+ {/*
+ {item.media_type} +
+
{item.slug}
*/} + +
+
+
+
+
+
+
+ {getStatusBadge(item.status)}{" "} + {/* 状态翻译 */} +
+ +
{item.text}
+
+
+
+ +
+
    + {item.audio_url ? ( + +
    + {t("downloadingAudio")}{" "} + {/* 翻译音频下载 */} +
    + + ) : ( + <> + )} + {item.video_url ? ( + +
    + {t("downloadingVideos")}{" "} + {/* 翻译视频下载 */} +
    + + ) : ( + <> + )} +
+
+
+
+
+
+
+
+ + ); +} diff --git a/src/ui/(console)/side-bar.tsx b/src/ui/(console)/side-bar.tsx new file mode 100644 index 0000000..94fb8a8 --- /dev/null +++ b/src/ui/(console)/side-bar.tsx @@ -0,0 +1,202 @@ +"use client"; + +import Link from "next/link"; +import { usePathname, useRouter } from "next/navigation"; +import React, { useState } from "react"; +import Image from "next/image"; +import logoImage from "/public/images/logo2.png"; +import { FaPlus, FaBars } from "react-icons/fa6"; +import { MdOutlineHome, MdLogout } from "react-icons/md"; +import { PiSquaresFourBold } from "react-icons/pi"; +import { BsLightningChargeFill } from "react-icons/bs"; +import { useTranslations } from "next-intl"; +import classNames from "classnames"; +import useUserStore from "@/store/userStore"; +import useFetch from "@/hooks/useFetch"; +import { useToast } from "@/contexts/ToastContext"; +import useLoadingStore from "@/store/loadingStore"; + +type MenuItem = { + name: string; + href: string; + icon?: React.ComponentType; +}; + +export default function SideBar() { + const pathname = usePathname(); + const router = useRouter(); + const user = useUserStore((state) => state.user); + const t = useTranslations("sideBar"); + const { addToast, addToastSuccess, addToastError } = useToast(); + const [sidebarOpen, setSidebarOpen] = useState(false); // 控制侧边栏的开关状态 + const hideLoading = useLoadingStore((state) => state.hideLoading); + const toggleSidebar = () => { + setSidebarOpen(!sidebarOpen); + }; + + const menu: { title: string; items: MenuItem[] }[] = [ + { + title: t("creation"), + items: [ + { + name: t("videos"), + href: "/projects", + icon: PiSquaresFourBold, + }, + ], + }, + ]; + + const { + fetchData: logoutFetch, + loading: logoutLoading, + data: logoutResult, + } = useFetch({ + url: "/api/logout/", // 假设你的退出接口路径为 /api/logout/ + method: "POST", + }); + + const logout = () => { + + logoutFetch() // 不需要传递参数 + .then((res) => { + addToastSuccess(t("logoutSuccess")); + router.push("/login"); // 退出成功后跳转到登录页面 + }) + .finally(() => { + hideLoading(); + }); + }; + + + + + return ( +
+ {/* 切换侧边栏按钮(仅在小屏幕显示) */} + + + {/* 侧边栏容器 */} +
+ {/* 侧边栏内容 */} +
+ + typeframes.ai logo + +
+ + + + + + {t("createNewVideo")} + + +
+
+ {menu.map((menuGroup) => { + return ( +
+
+ {menuGroup.title} +
+ {menuGroup.items.map((item) => { + return ( +
+ + + {item.name} + +
+ ); + })} +
+ ); + })} +
+ +
+
+
+ + + {t("upgradeNow")} + +
+
+
+
+
+
+ {user?.username + ? user.username + : user?.email} +
+
+ {t("aiCredits")}: {user?.points} +
+
+
+ +
+
+
+
+
+ + {/* 点击空白处关闭侧边栏 */} + {sidebarOpen && ( +
+ )} +
+ ); +} + diff --git a/src/ui/login/google-login.tsx b/src/ui/login/google-login.tsx new file mode 100644 index 0000000..1657a04 --- /dev/null +++ b/src/ui/login/google-login.tsx @@ -0,0 +1,33 @@ +"use client"; +import useFetch from "@/hooks/useFetch"; +import { useTranslations } from "next-intl"; +import { useState } from "react"; +export default function GoogleLogin() { + const t = useTranslations("loginForm"); + + const { fetchData: fetchGoogleLogin, loading: loading } = useFetch({ + url: "/oauth2callback/google/login", + method: "POST", + }); + const googleLogin = () => { + fetchGoogleLogin(); + }; + + return ( + + ); +} diff --git a/src/ui/login/js/GridArrayBg.module.js b/src/ui/login/js/GridArrayBg.module.js new file mode 100644 index 0000000..73bd197 --- /dev/null +++ b/src/ui/login/js/GridArrayBg.module.js @@ -0,0 +1 @@ +function t(t,e){(null==e||e>t.length)&&(e=t.length);for(var i=0,r=Array(e);i0&&(s=1/Math.sqrt(s)),t[0]=e[0]*s,t[1]=e[1]*s,t[2]=e[2]*s,t}function w(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]}function k(t,e,i){var r=e[0],n=e[1],s=e[2],a=i[0],h=i[1],o=i[2];return t[0]=n*o-s*h,t[1]=s*a-r*o,t[2]=r*h-n*a,t}var M,A,T=(M=[0,0,0],A=[0,0,0],function(t,e){m(M,t),m(A,e),E(M,M),E(A,A);var i=w(M,A);return i>1?0:i<-1?Math.PI:Math.acos(i)});var F=function(t){function r(){var t,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:n,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:n;return i(this,r),u(t=e(this,r,[n,s,a]),t)}return h(r,v(Array)),n(r,[{key:"x",get:function(){return this[0]},set:function(t){this[0]=t}},{key:"y",get:function(){return this[1]},set:function(t){this[1]=t}},{key:"z",get:function(){return this[2]},set:function(t){this[2]=t}},{key:"set",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t;return t.length?this.copy(t):(function(t,e,i,r){t[0]=e,t[1]=i,t[2]=r}(this,t,e,i),this)}},{key:"copy",value:function(t){return m(this,t),this}},{key:"add",value:function(t,e){return e?y(this,t,e):y(this,this,t),this}},{key:"sub",value:function(t,e){return e?_(this,t,e):_(this,this,t),this}},{key:"multiply",value:function(t){var e,i,r;return t.length?(i=this,r=t,(e=this)[0]=i[0]*r[0],e[1]=i[1]*r[1],e[2]=i[2]*r[2]):b(this,this,t),this}},{key:"divide",value:function(t){var e,i,r;return t.length?(i=this,r=t,(e=this)[0]=i[0]/r[0],e[1]=i[1]/r[1],e[2]=i[2]/r[2]):b(this,this,1/t),this}},{key:"inverse",value:function(){var t,e;return e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this,(t=this)[0]=1/e[0],t[1]=1/e[1],t[2]=1/e[2],this}},{key:"len",value:function(){return p(this)}},{key:"distance",value:function(t){return t?(e=this,r=(i=t)[0]-e[0],n=i[1]-e[1],s=i[2]-e[2],Math.sqrt(r*r+n*n+s*s)):p(this);var e,i,r,n,s}},{key:"squaredLen",value:function(){return x(this)}},{key:"squaredDistance",value:function(t){return t?(e=this,r=(i=t)[0]-e[0],n=i[1]-e[1],s=i[2]-e[2],r*r+n*n+s*s):x(this);var e,i,r,n,s}},{key:"negate",value:function(){var t,e;return e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this,(t=this)[0]=-e[0],t[1]=-e[1],t[2]=-e[2],this}},{key:"cross",value:function(t,e){return e?k(this,t,e):k(this,this,t),this}},{key:"scale",value:function(t){return b(this,this,t),this}},{key:"normalize",value:function(){return E(this,this),this}},{key:"dot",value:function(t){return w(this,t)}},{key:"equals",value:function(t){return i=t,(e=this)[0]===i[0]&&e[1]===i[1]&&e[2]===i[2];var e,i}},{key:"applyMatrix3",value:function(t){var e,i,r,n,s,a;return e=this,r=t,n=(i=this)[0],s=i[1],a=i[2],e[0]=n*r[0]+s*r[3]+a*r[6],e[1]=n*r[1]+s*r[4]+a*r[7],e[2]=n*r[2]+s*r[5]+a*r[8],this}},{key:"applyMatrix4",value:function(t){var e,i,r,n,s,a,h;return e=this,r=t,n=(i=this)[0],s=i[1],a=i[2],h=(h=r[3]*n+r[7]*s+r[11]*a+r[15])||1,e[0]=(r[0]*n+r[4]*s+r[8]*a+r[12])/h,e[1]=(r[1]*n+r[5]*s+r[9]*a+r[13])/h,e[2]=(r[2]*n+r[6]*s+r[10]*a+r[14])/h,this}},{key:"scaleRotateMatrix4",value:function(t){var e,i,r,n,s,a,h;return e=this,r=t,n=(i=this)[0],s=i[1],a=i[2],h=(h=r[3]*n+r[7]*s+r[11]*a+r[15])||1,e[0]=(r[0]*n+r[4]*s+r[8]*a)/h,e[1]=(r[1]*n+r[5]*s+r[9]*a)/h,e[2]=(r[2]*n+r[6]*s+r[10]*a)/h,this}},{key:"applyQuaternion",value:function(t){return function(t,e,i){var r=e[0],n=e[1],s=e[2],a=i[0],h=i[1],o=i[2],u=h*s-o*n,l=o*r-a*s,c=a*n-h*r,f=h*c-o*l,d=o*u-a*c,g=a*l-h*u,v=2*i[3];u*=v,l*=v,c*=v,f*=2,d*=2,g*=2,t[0]=r+u+f,t[1]=n+l+d,t[2]=s+c+g}(this,this,t),this}},{key:"angle",value:function(t){return T(this,t)}},{key:"lerp",value:function(t,e){return function(t,e,i,r){var n=e[0],s=e[1],a=e[2];t[0]=n+r*(i[0]-n),t[1]=s+r*(i[1]-s),t[2]=a+r*(i[2]-a)}(this,this,t,e),this}},{key:"clone",value:function(){return new r(this[0],this[1],this[2])}},{key:"fromArray",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return this[0]=t[e],this[1]=t[e+1],this[2]=t[e+2],this}},{key:"toArray",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return t[e]=this[0],t[e+1]=this[1],t[e+2]=this[2],t}},{key:"transformDirection",value:function(t){var e=this[0],i=this[1],r=this[2];return this[0]=t[0]*e+t[4]*i+t[8]*r,this[1]=t[1]*e+t[5]*i+t[9]*r,this[2]=t[2]*e+t[6]*i+t[10]*r,this.normalize()}}])}(),R=new F,S=1,C=1,P=!1,O=function(){return n((function t(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};for(var n in i(this,t),e.canvas,this.gl=e,this.attributes=r,this.id=S++,this.VAOs={},this.drawRange={start:0,count:0},this.instancedCount=0,this.gl.renderer.bindVertexArray(null),this.gl.renderer.currentGeometry=null,this.glState=this.gl.renderer.state,r)this.addAttribute(n,r[n])}),[{key:"addAttribute",value:function(t,e){this.attributes[t]=e;var i=this;if(e.id=C++,e.size=e.size||1,e.type=e.type||(e.data.constructor===Float32Array?this.gl.FLOAT:e.data.constructor===Uint16Array?this.gl.UNSIGNED_SHORT:this.gl.UNSIGNED_INT),e.target="index"===t?this.gl.ELEMENT_ARRAY_BUFFER:this.gl.ARRAY_BUFFER,e.normalized=e.normalized||!1,e.stride=e.stride||0,e.offset=e.offset||0,e.count=e.count||(e.stride?e.data.byteLength/e.stride:e.data.length/e.size),e.divisor=e.instanced||0,e.needsUpdate=!1,e.usage=e.usage||this.gl.STATIC_DRAW,e.getX=function(t){return this.data[t*this.size]},e.getY=function(t){return this.data[t*this.size+1]},e.getZ=function(t){return this.data[t*this.size+2]},e.setXYZ=function(t,r,n,s){t*=this.size,this.data[t+0]=r,this.data[t+1]=n,this.data[t+2]=s,i.updateAttribute(e)},e.buffer||this.updateAttribute(e),e.divisor){if(this.isInstanced=!0,this.instancedCount&&this.instancedCount!==e.count*e.divisor)return this.instancedCount=Math.min(this.instancedCount,e.count*e.divisor);this.instancedCount=e.count*e.divisor}else"index"===t?this.drawRange.count=e.count:this.attributes.index||(this.drawRange.count=Math.max(this.drawRange.count,e.count))}},{key:"updateAttribute",value:function(t){var e=!t.buffer;e&&(t.buffer=this.gl.createBuffer()),this.glState.boundBuffer!==t.buffer&&(this.gl.bindBuffer(t.target,t.buffer),this.glState.boundBuffer=t.buffer),e?this.gl.bufferData(t.target,t.data,t.usage):this.gl.bufferSubData(t.target,0,t.data),t.needsUpdate=!1}},{key:"setIndex",value:function(t){this.addAttribute("index",t)}},{key:"setDrawRange",value:function(t,e){this.drawRange.start=t,this.drawRange.count=e}},{key:"setInstancedCount",value:function(t){this.instancedCount=t}},{key:"createVAO",value:function(t){this.VAOs[t.attributeOrder]=this.gl.renderer.createVertexArray(),this.gl.renderer.bindVertexArray(this.VAOs[t.attributeOrder]),this.bindAttributes(t)}},{key:"bindAttributes",value:function(t){var e=this;t.attributeLocations.forEach((function(t,i){var r=i.name,n=i.type;if(e.attributes[r]){var s=e.attributes[r];e.gl.bindBuffer(s.target,s.buffer),e.glState.boundBuffer=s.buffer;var a=1;35674===n&&(a=2),35675===n&&(a=3),35676===n&&(a=4);for(var h=s.size/a,o=1===a?0:a*a*4,u=1===a?0:4*a,l=0;l1&&void 0!==arguments[1]?arguments[1]:{},n=r.vertex,s=r.fragment,a=r.uniforms,h=void 0===a?{}:a,o=r.transparent,u=void 0!==o&&o,l=r.cullFace,c=void 0===l?e.BACK:l,f=r.frontFace,d=void 0===f?e.CCW:f,g=r.depthTest,v=void 0===g||g,p=r.depthWrite,m=void 0===p||p,y=r.depthFunc,_=void 0===y?e.LEQUAL:y;i(this,t),e.canvas,this.gl=e,this.uniforms=h,this.id=B++,this.transparent=u,this.cullFace=c,this.frontFace=d,this.depthTest=v,this.depthWrite=m,this.depthFunc=_,this.blendFunc={},this.blendEquation={},this.transparent&&!this.blendFunc.src&&(this.gl.renderer.premultipliedAlpha?this.setBlendFunc(this.gl.ONE,this.gl.ONE_MINUS_SRC_ALPHA):this.setBlendFunc(this.gl.SRC_ALPHA,this.gl.ONE_MINUS_SRC_ALPHA)),this.vertexShader=e.createShader(e.VERTEX_SHADER),this.fragmentShader=e.createShader(e.FRAGMENT_SHADER),this.program=e.createProgram(),e.attachShader(this.program,this.vertexShader),e.attachShader(this.program,this.fragmentShader),this.setShaders({vertex:n,fragment:s})}),[{key:"setShaders",value:function(t){var e=t.vertex,i=t.fragment;if(e&&(this.gl.shaderSource(this.vertexShader,e),this.gl.compileShader(this.vertexShader),this.gl.getShaderInfoLog(this.vertexShader)),i&&(this.gl.shaderSource(this.fragmentShader,i),this.gl.compileShader(this.fragmentShader),this.gl.getShaderInfoLog(this.fragmentShader)),this.gl.linkProgram(this.program),this.gl.getProgramParameter(this.program,this.gl.LINK_STATUS)){this.uniformLocations=new Map;for(var r=this.gl.getProgramParameter(this.program,this.gl.ACTIVE_UNIFORMS),n=0;n0&&void 0!==arguments[0]?arguments[0]:{}).flipFaces,i=void 0!==e&&e,r=-1;this.gl.renderer.state.currentProgram===this.id||(this.gl.useProgram(this.program),this.gl.renderer.state.currentProgram=this.id),this.uniformLocations.forEach((function(e,i){var n,s=t.uniforms[i.uniformName],a=function(t,e){var i="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(!i){if(Array.isArray(t)||(i=g(t))||e){i&&(t=i);var r=0,n=function(){};return{s:n,n:function(){return r>=t.length?{done:!0}:{done:!1,value:t[r++]}},e:function(t){throw t},f:n}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var s,a=!0,h=!1;return{s:function(){i=i.call(t)},n:function(){var t=i.next();return a=t.done,t},e:function(t){h=!0,s=t},f:function(){try{a||null==i.return||i.return()}finally{if(h)throw s}}}}(i.nameComponents);try{for(a.s();!(n=a.n()).done;){var h=n.value;if(!s)break;if(!(h in s)){if(Array.isArray(s.value))break;s=void 0;break}s=s[h]}}catch(t){a.e(t)}finally{a.f()}if(!s)return L("Active uniform ".concat(i.name," has not been supplied"));if(s&&void 0===s.value)return L("".concat(i.name," uniform is missing a value parameter"));if(s.value.texture)return r+=1,s.value.update(r),D(t.gl,i.type,e,r);if(s.value.length&&s.value[0].texture){var o=[];return s.value.forEach((function(t){r+=1,t.update(r),o.push(r)})),D(t.gl,i.type,e,o)}D(t.gl,i.type,e,s.value)})),this.applyState(),i&&this.gl.renderer.setFrontFace(this.frontFace===this.gl.CCW?this.gl.CW:this.gl.CCW)}},{key:"remove",value:function(){this.gl.deleteProgram(this.program)}}])}();function D(t,e,i,r){r=r.length?function(t){var e=t.length,i=t[0].length;if(void 0===i)return t;var r=e*i,n=N[r];n||(N[r]=n=new Float32Array(r));for(var s=0;s100||I++}var z=new F,j=1,q=function(){return n((function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=e.canvas,n=void 0===r?document.createElement("canvas"):r,s=e.width,a=void 0===s?300:s,h=e.height,o=void 0===h?150:h,u=e.dpr,l=void 0===u?1:u,c=e.alpha,f=void 0!==c&&c,d=e.depth,g=void 0===d||d,v=e.stencil,p=void 0!==v&&v,m=e.antialias,y=void 0===m||m,_=e.premultipliedAlpha,b=void 0!==_&&_,x=e.preserveDrawingBuffer,E=void 0===x||x,w=e.powerPreference,k=void 0===w?"default":w,M=e.autoClear,A=void 0===M||M,T=e.webgl,F=void 0===T?2:T;i(this,t);var R={alpha:f,depth:g,stencil:p,antialias:y,premultipliedAlpha:b,preserveDrawingBuffer:E,powerPreference:k};this.dpr=l,this.alpha=f,this.color=!0,this.depth=g,this.stencil=p,this.premultipliedAlpha=b,this.autoClear=A,this.id=j++,2===F&&(this.gl=n.getContext("webgl2",R)),this.isWebgl2=!!this.gl,this.gl||(this.gl=n.getContext("webgl",R)),this.gl,this.gl.renderer=this,this.setSize(a,o),this.state={},this.state.blendFunc={src:this.gl.ONE,dst:this.gl.ZERO},this.state.blendEquation={modeRGB:this.gl.FUNC_ADD},this.state.cullFace=!1,this.state.frontFace=this.gl.CCW,this.state.depthMask=!0,this.state.depthFunc=this.gl.LEQUAL,this.state.premultiplyAlpha=!1,this.state.flipY=!1,this.state.unpackAlignment=4,this.state.framebuffer=null,this.state.viewport={x:0,y:0,width:null,height:null},this.state.textureUnits=[],this.state.activeTextureUnit=0,this.state.boundBuffer=null,this.state.uniformLocations=new Map,this.state.currentProgram=null,this.extensions={},this.isWebgl2?(this.getExtension("EXT_color_buffer_float"),this.getExtension("OES_texture_float_linear")):(this.getExtension("OES_texture_float"),this.getExtension("OES_texture_float_linear"),this.getExtension("OES_texture_half_float"),this.getExtension("OES_texture_half_float_linear"),this.getExtension("OES_element_index_uint"),this.getExtension("OES_standard_derivatives"),this.getExtension("EXT_sRGB"),this.getExtension("WEBGL_depth_texture"),this.getExtension("WEBGL_draw_buffers")),this.getExtension("WEBGL_compressed_texture_astc"),this.getExtension("EXT_texture_compression_bptc"),this.getExtension("WEBGL_compressed_texture_s3tc"),this.getExtension("WEBGL_compressed_texture_etc1"),this.getExtension("WEBGL_compressed_texture_pvrtc"),this.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc"),this.vertexAttribDivisor=this.getExtension("ANGLE_instanced_arrays","vertexAttribDivisor","vertexAttribDivisorANGLE"),this.drawArraysInstanced=this.getExtension("ANGLE_instanced_arrays","drawArraysInstanced","drawArraysInstancedANGLE"),this.drawElementsInstanced=this.getExtension("ANGLE_instanced_arrays","drawElementsInstanced","drawElementsInstancedANGLE"),this.createVertexArray=this.getExtension("OES_vertex_array_object","createVertexArray","createVertexArrayOES"),this.bindVertexArray=this.getExtension("OES_vertex_array_object","bindVertexArray","bindVertexArrayOES"),this.deleteVertexArray=this.getExtension("OES_vertex_array_object","deleteVertexArray","deleteVertexArrayOES"),this.drawBuffers=this.getExtension("WEBGL_draw_buffers","drawBuffers","drawBuffersWEBGL"),this.parameters={},this.parameters.maxTextureUnits=this.gl.getParameter(this.gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS),this.parameters.maxAnisotropy=this.getExtension("EXT_texture_filter_anisotropic")?this.gl.getParameter(this.getExtension("EXT_texture_filter_anisotropic").MAX_TEXTURE_MAX_ANISOTROPY_EXT):0}),[{key:"setSize",value:function(t,e){this.width=t,this.height=e,this.gl.canvas.width=t*this.dpr,this.gl.canvas.height=e*this.dpr,this.gl.canvas.style&&Object.assign(this.gl.canvas.style,{width:t+"px",height:e+"px"})}},{key:"setViewport",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0;this.state.viewport.width===t&&this.state.viewport.height===e||(this.state.viewport.width=t,this.state.viewport.height=e,this.state.viewport.x=i,this.state.viewport.y=r,this.gl.viewport(i,r,t,e))}},{key:"setScissor",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0;this.gl.scissor(i,r,t,e)}},{key:"enable",value:function(t){!0!==this.state[t]&&(this.gl.enable(t),this.state[t]=!0)}},{key:"disable",value:function(t){!1!==this.state[t]&&(this.gl.disable(t),this.state[t]=!1)}},{key:"setBlendFunc",value:function(t,e,i,r){this.state.blendFunc.src===t&&this.state.blendFunc.dst===e&&this.state.blendFunc.srcAlpha===i&&this.state.blendFunc.dstAlpha===r||(this.state.blendFunc.src=t,this.state.blendFunc.dst=e,this.state.blendFunc.srcAlpha=i,this.state.blendFunc.dstAlpha=r,void 0!==i?this.gl.blendFuncSeparate(t,e,i,r):this.gl.blendFunc(t,e))}},{key:"setBlendEquation",value:function(t,e){t=t||this.gl.FUNC_ADD,this.state.blendEquation.modeRGB===t&&this.state.blendEquation.modeAlpha===e||(this.state.blendEquation.modeRGB=t,this.state.blendEquation.modeAlpha=e,void 0!==e?this.gl.blendEquationSeparate(t,e):this.gl.blendEquation(t))}},{key:"setCullFace",value:function(t){this.state.cullFace!==t&&(this.state.cullFace=t,this.gl.cullFace(t))}},{key:"setFrontFace",value:function(t){this.state.frontFace!==t&&(this.state.frontFace=t,this.gl.frontFace(t))}},{key:"setDepthMask",value:function(t){this.state.depthMask!==t&&(this.state.depthMask=t,this.gl.depthMask(t))}},{key:"setDepthFunc",value:function(t){this.state.depthFunc!==t&&(this.state.depthFunc=t,this.gl.depthFunc(t))}},{key:"activeTexture",value:function(t){this.state.activeTextureUnit!==t&&(this.state.activeTextureUnit=t,this.gl.activeTexture(this.gl.TEXTURE0+t))}},{key:"bindFramebuffer",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=t.target,i=void 0===e?this.gl.FRAMEBUFFER:e,r=t.buffer,n=void 0===r?null:r;this.state.framebuffer!==n&&(this.state.framebuffer=n,this.gl.bindFramebuffer(i,n))}},{key:"getExtension",value:function(t,e,i){return e&&this.gl[e]?this.gl[e].bind(this.gl):(this.extensions[t]||(this.extensions[t]=this.gl.getExtension(t)),e?this.extensions[t]?this.extensions[t][i].bind(this.extensions[t]):null:this.extensions[t])}},{key:"sortOpaque",value:function(t,e){return t.renderOrder!==e.renderOrder?t.renderOrder-e.renderOrder:t.program.id!==e.program.id?t.program.id-e.program.id:t.zDepth!==e.zDepth?t.zDepth-e.zDepth:e.id-t.id}},{key:"sortTransparent",value:function(t,e){return t.renderOrder!==e.renderOrder?t.renderOrder-e.renderOrder:t.zDepth!==e.zDepth?e.zDepth-t.zDepth:e.id-t.id}},{key:"sortUI",value:function(t,e){return t.renderOrder!==e.renderOrder?t.renderOrder-e.renderOrder:t.program.id!==e.program.id?t.program.id-e.program.id:e.id-t.id}},{key:"getRenderList",value:function(t){var e=t.scene,i=t.camera,r=t.frustumCull,n=t.sort,s=[];if(i&&r&&i.updateFrustum(),e.traverse((function(t){if(!t.visible)return!0;t.draw&&(r&&t.frustumCulled&&i&&!i.frustumIntersectsMesh(t)||s.push(t))})),n){var a=[],h=[],o=[];s.forEach((function(t){t.program.transparent?t.program.depthTest?h.push(t):o.push(t):a.push(t),t.zDepth=0,0===t.renderOrder&&t.program.depthTest&&i&&(t.worldMatrix.getTranslation(z),z.applyMatrix4(i.projectionViewMatrix),t.zDepth=z.z)})),a.sort(this.sortOpaque),h.sort(this.sortTransparent),o.sort(this.sortUI),s=a.concat(h,o)}return s}},{key:"render",value:function(t){var e=t.scene,i=t.camera,r=t.target,n=void 0===r?null:r,s=t.update,a=void 0===s||s,h=t.sort,o=void 0===h||h,u=t.frustumCull,l=void 0===u||u,c=t.clear;null===n?(this.bindFramebuffer(),this.setViewport(this.width*this.dpr,this.height*this.dpr)):(this.bindFramebuffer(n),this.setViewport(n.width,n.height)),(c||this.autoClear&&!1!==c)&&(!this.depth||n&&!n.depth||(this.enable(this.gl.DEPTH_TEST),this.setDepthMask(!0)),this.gl.clear((this.color?this.gl.COLOR_BUFFER_BIT:0)|(this.depth?this.gl.DEPTH_BUFFER_BIT:0)|(this.stencil?this.gl.STENCIL_BUFFER_BIT:0))),a&&e.updateMatrixWorld(),i&&i.updateMatrixWorld(),this.getRenderList({scene:e,camera:i,frustumCull:l,sort:o}).forEach((function(t){t.draw({camera:i})}))}}])}();function G(t,e,i){var r=e[0],n=e[1],s=e[2],a=e[3],h=i[0],o=i[1],u=i[2],l=i[3];return t[0]=r*l+a*h+n*u-s*o,t[1]=n*l+a*o+s*h-r*u,t[2]=s*l+a*u+r*o-n*h,t[3]=a*l-r*h-n*o-s*u,t}var X=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t},V=function(t,e,i,r,n){return t[0]=e,t[1]=i,t[2]=r,t[3]=n,t},W=function(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]+t[3]*e[3]},H=function(t,e){var i=e[0],r=e[1],n=e[2],s=e[3],a=i*i+r*r+n*n+s*s;return a>0&&(a=1/Math.sqrt(a)),t[0]=i*a,t[1]=r*a,t[2]=n*a,t[3]=s*a,t},Y=function(t){function r(){var t,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,h=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1;i(this,r),(t=e(this,r,[n,s,a,h])).onChange=function(){},t._target=t;var o=["0","1","2","3"];return u(t,new Proxy(t,{set:function(t,e){var i=Reflect.set.apply(Reflect,arguments);return i&&o.includes(e)&&t.onChange(),i}}))}return h(r,v(Array)),n(r,[{key:"x",get:function(){return this[0]},set:function(t){this._target[0]=t,this.onChange()}},{key:"y",get:function(){return this[1]},set:function(t){this._target[1]=t,this.onChange()}},{key:"z",get:function(){return this[2]},set:function(t){this._target[2]=t,this.onChange()}},{key:"w",get:function(){return this[3]},set:function(t){this._target[3]=t,this.onChange()}},{key:"identity",value:function(){var t;return(t=this._target)[0]=0,t[1]=0,t[2]=0,t[3]=1,this.onChange(),this}},{key:"set",value:function(t,e,i,r){return t.length?this.copy(t):(V(this._target,t,e,i,r),this.onChange(),this)}},{key:"rotateX",value:function(t){return function(t,e,i){i*=.5;var r=e[0],n=e[1],s=e[2],a=e[3],h=Math.sin(i),o=Math.cos(i);t[0]=r*o+a*h,t[1]=n*o+s*h,t[2]=s*o-n*h,t[3]=a*o-r*h}(this._target,this._target,t),this.onChange(),this}},{key:"rotateY",value:function(t){return function(t,e,i){i*=.5;var r=e[0],n=e[1],s=e[2],a=e[3],h=Math.sin(i),o=Math.cos(i);t[0]=r*o-s*h,t[1]=n*o+a*h,t[2]=s*o+r*h,t[3]=a*o-n*h}(this._target,this._target,t),this.onChange(),this}},{key:"rotateZ",value:function(t){return function(t,e,i){i*=.5;var r=e[0],n=e[1],s=e[2],a=e[3],h=Math.sin(i),o=Math.cos(i);t[0]=r*o+n*h,t[1]=n*o-r*h,t[2]=s*o+a*h,t[3]=a*o-s*h}(this._target,this._target,t),this.onChange(),this}},{key:"inverse",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this._target;return function(t,e){var i=e[0],r=e[1],n=e[2],s=e[3],a=i*i+r*r+n*n+s*s,h=a?1/a:0;t[0]=-i*h,t[1]=-r*h,t[2]=-n*h,t[3]=s*h}(this._target,t),this.onChange(),this}},{key:"conjugate",value:function(){var t,e,i=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this._target;return t=this._target,e=i,t[0]=-e[0],t[1]=-e[1],t[2]=-e[2],t[3]=e[3],this.onChange(),this}},{key:"copy",value:function(t){return X(this._target,t),this.onChange(),this}},{key:"normalize",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this._target;return H(this._target,t),this.onChange(),this}},{key:"multiply",value:function(t,e){return e?G(this._target,t,e):G(this._target,this._target,t),this.onChange(),this}},{key:"dot",value:function(t){return W(this._target,t)}},{key:"fromMatrix3",value:function(t){return function(t,e){var i,r=e[0]+e[4]+e[8];if(r>0)i=Math.sqrt(r+1),t[3]=.5*i,i=.5/i,t[0]=(e[5]-e[7])*i,t[1]=(e[6]-e[2])*i,t[2]=(e[1]-e[3])*i;else{var n=0;e[4]>e[0]&&(n=1),e[8]>e[3*n+n]&&(n=2);var s=(n+1)%3,a=(n+2)%3;i=Math.sqrt(e[3*n+n]-e[3*s+s]-e[3*a+a]+1),t[n]=.5*i,i=.5/i,t[3]=(e[3*s+a]-e[3*a+s])*i,t[s]=(e[3*s+n]+e[3*n+s])*i,t[a]=(e[3*a+n]+e[3*n+a])*i}}(this._target,t),this.onChange(),this}},{key:"fromEuler",value:function(t,e){return function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"YXZ",r=Math.sin(.5*e[0]),n=Math.cos(.5*e[0]),s=Math.sin(.5*e[1]),a=Math.cos(.5*e[1]),h=Math.sin(.5*e[2]),o=Math.cos(.5*e[2]);"XYZ"===i?(t[0]=r*a*o+n*s*h,t[1]=n*s*o-r*a*h,t[2]=n*a*h+r*s*o,t[3]=n*a*o-r*s*h):"YXZ"===i?(t[0]=r*a*o+n*s*h,t[1]=n*s*o-r*a*h,t[2]=n*a*h-r*s*o,t[3]=n*a*o+r*s*h):"ZXY"===i?(t[0]=r*a*o-n*s*h,t[1]=n*s*o+r*a*h,t[2]=n*a*h+r*s*o,t[3]=n*a*o-r*s*h):"ZYX"===i?(t[0]=r*a*o-n*s*h,t[1]=n*s*o+r*a*h,t[2]=n*a*h-r*s*o,t[3]=n*a*o+r*s*h):"YZX"===i?(t[0]=r*a*o+n*s*h,t[1]=n*s*o+r*a*h,t[2]=n*a*h-r*s*o,t[3]=n*a*o-r*s*h):"XZY"===i&&(t[0]=r*a*o-n*s*h,t[1]=n*s*o-r*a*h,t[2]=n*a*h+r*s*o,t[3]=n*a*o+r*s*h)}(this._target,t,t.order),e||this.onChange(),this}},{key:"fromAxisAngle",value:function(t,e){return function(t,e,i){i*=.5;var r=Math.sin(i);t[0]=r*e[0],t[1]=r*e[1],t[2]=r*e[2],t[3]=Math.cos(i)}(this._target,t,e),this.onChange(),this}},{key:"slerp",value:function(t,e){return function(t,e,i,r){var n,s,a,h,o,u=e[0],l=e[1],c=e[2],f=e[3],d=i[0],g=i[1],v=i[2],p=i[3];(s=u*d+l*g+c*v+f*p)<0&&(s=-s,d=-d,g=-g,v=-v,p=-p),1-s>1e-6?(n=Math.acos(s),a=Math.sin(n),h=Math.sin((1-r)*n)/a,o=Math.sin(r*n)/a):(h=1-r,o=r),t[0]=h*u+o*d,t[1]=h*l+o*g,t[2]=h*c+o*v,t[3]=h*f+o*p}(this._target,this._target,t,e),this.onChange(),this}},{key:"fromArray",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return this._target[0]=t[e],this._target[1]=t[e+1],this._target[2]=t[e+2],this._target[3]=t[e+3],this.onChange(),this}},{key:"toArray",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return t[e]=this[0],t[e+1]=this[1],t[e+2]=this[2],t[e+3]=this[3],t}}])}();function Z(t){var e=t[0],i=t[1],r=t[2],n=t[3],s=t[4],a=t[5],h=t[6],o=t[7],u=t[8],l=t[9],c=t[10],f=t[11],d=t[12],g=t[13],v=t[14],p=t[15];return(e*a-i*s)*(c*p-f*v)-(e*h-r*s)*(l*p-f*g)+(e*o-n*s)*(l*v-c*g)+(i*h-r*a)*(u*p-f*d)-(i*o-n*a)*(u*v-c*d)+(r*o-n*h)*(u*g-l*d)}function Q(t,e,i){var r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],o=e[5],u=e[6],l=e[7],c=e[8],f=e[9],d=e[10],g=e[11],v=e[12],p=e[13],m=e[14],y=e[15],_=i[0],b=i[1],x=i[2],E=i[3];return t[0]=_*r+b*h+x*c+E*v,t[1]=_*n+b*o+x*f+E*p,t[2]=_*s+b*u+x*d+E*m,t[3]=_*a+b*l+x*g+E*y,_=i[4],b=i[5],x=i[6],E=i[7],t[4]=_*r+b*h+x*c+E*v,t[5]=_*n+b*o+x*f+E*p,t[6]=_*s+b*u+x*d+E*m,t[7]=_*a+b*l+x*g+E*y,_=i[8],b=i[9],x=i[10],E=i[11],t[8]=_*r+b*h+x*c+E*v,t[9]=_*n+b*o+x*f+E*p,t[10]=_*s+b*u+x*d+E*m,t[11]=_*a+b*l+x*g+E*y,_=i[12],b=i[13],x=i[14],E=i[15],t[12]=_*r+b*h+x*c+E*v,t[13]=_*n+b*o+x*f+E*p,t[14]=_*s+b*u+x*d+E*m,t[15]=_*a+b*l+x*g+E*y,t}function K(t,e){var i=e[0],r=e[1],n=e[2],s=e[4],a=e[5],h=e[6],o=e[8],u=e[9],l=e[10];return t[0]=Math.hypot(i,r,n),t[1]=Math.hypot(s,a,h),t[2]=Math.hypot(o,u,l),t}var $,J=($=[1,1,1],function(t,e){var i=$;K(i,e);var r=1/i[0],n=1/i[1],s=1/i[2],a=e[0]*r,h=e[1]*n,o=e[2]*s,u=e[4]*r,l=e[5]*n,c=e[6]*s,f=e[8]*r,d=e[9]*n,g=e[10]*s,v=a+l+g,p=0;return v>0?(p=2*Math.sqrt(v+1),t[3]=.25*p,t[0]=(c-d)/p,t[1]=(f-o)/p,t[2]=(h-u)/p):a>l&&a>g?(p=2*Math.sqrt(1+a-l-g),t[3]=(c-d)/p,t[0]=.25*p,t[1]=(h+u)/p,t[2]=(f+o)/p):l>g?(p=2*Math.sqrt(1+l-a-g),t[3]=(f-o)/p,t[0]=(h+u)/p,t[1]=.25*p,t[2]=(c+d)/p):(p=2*Math.sqrt(1+g-a-l),t[3]=(h-u)/p,t[0]=(f+o)/p,t[1]=(c+d)/p,t[2]=.25*p),t});function tt(t,e,i){return t[0]=e[0]+i[0],t[1]=e[1]+i[1],t[2]=e[2]+i[2],t[3]=e[3]+i[3],t[4]=e[4]+i[4],t[5]=e[5]+i[5],t[6]=e[6]+i[6],t[7]=e[7]+i[7],t[8]=e[8]+i[8],t[9]=e[9]+i[9],t[10]=e[10]+i[10],t[11]=e[11]+i[11],t[12]=e[12]+i[12],t[13]=e[13]+i[13],t[14]=e[14]+i[14],t[15]=e[15]+i[15],t}function et(t,e,i){return t[0]=e[0]-i[0],t[1]=e[1]-i[1],t[2]=e[2]-i[2],t[3]=e[3]-i[3],t[4]=e[4]-i[4],t[5]=e[5]-i[5],t[6]=e[6]-i[6],t[7]=e[7]-i[7],t[8]=e[8]-i[8],t[9]=e[9]-i[9],t[10]=e[10]-i[10],t[11]=e[11]-i[11],t[12]=e[12]-i[12],t[13]=e[13]-i[13],t[14]=e[14]-i[14],t[15]=e[15]-i[15],t}var it=function(t){function r(){var t,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,h=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,l=arguments.length>5&&void 0!==arguments[5]?arguments[5]:1,c=arguments.length>6&&void 0!==arguments[6]?arguments[6]:0,f=arguments.length>7&&void 0!==arguments[7]?arguments[7]:0,d=arguments.length>8&&void 0!==arguments[8]?arguments[8]:0,g=arguments.length>9&&void 0!==arguments[9]?arguments[9]:0,v=arguments.length>10&&void 0!==arguments[10]?arguments[10]:1,p=arguments.length>11&&void 0!==arguments[11]?arguments[11]:0,m=arguments.length>12&&void 0!==arguments[12]?arguments[12]:0,y=arguments.length>13&&void 0!==arguments[13]?arguments[13]:0,_=arguments.length>14&&void 0!==arguments[14]?arguments[14]:0,b=arguments.length>15&&void 0!==arguments[15]?arguments[15]:1;return i(this,r),u(t=e(this,r,[n,s,a,h,o,l,c,f,d,g,v,p,m,y,_,b]),t)}return h(r,v(Array)),n(r,[{key:"x",get:function(){return this[12]},set:function(t){this[12]=t}},{key:"y",get:function(){return this[13]},set:function(t){this[13]=t}},{key:"z",get:function(){return this[14]},set:function(t){this[14]=t}},{key:"w",get:function(){return this[15]},set:function(t){this[15]=t}},{key:"set",value:function(t,e,i,r,n,s,a,h,o,u,l,c,f,d,g,v){return t.length?this.copy(t):(function(t,e,i,r,n,s,a,h,o,u,l,c,f,d,g,v,p){t[0]=e,t[1]=i,t[2]=r,t[3]=n,t[4]=s,t[5]=a,t[6]=h,t[7]=o,t[8]=u,t[9]=l,t[10]=c,t[11]=f,t[12]=d,t[13]=g,t[14]=v,t[15]=p}(this,t,e,i,r,n,s,a,h,o,u,l,c,f,d,g,v),this)}},{key:"translate",value:function(t){return function(t,e,i){var r,n,s,a,h,o,u,l,c,f,d,g,v=i[0],p=i[1],m=i[2];e===t?(t[12]=e[0]*v+e[4]*p+e[8]*m+e[12],t[13]=e[1]*v+e[5]*p+e[9]*m+e[13],t[14]=e[2]*v+e[6]*p+e[10]*m+e[14],t[15]=e[3]*v+e[7]*p+e[11]*m+e[15]):(r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],o=e[5],u=e[6],l=e[7],c=e[8],f=e[9],d=e[10],g=e[11],t[0]=r,t[1]=n,t[2]=s,t[3]=a,t[4]=h,t[5]=o,t[6]=u,t[7]=l,t[8]=c,t[9]=f,t[10]=d,t[11]=g,t[12]=r*v+h*p+c*m+e[12],t[13]=n*v+o*p+f*m+e[13],t[14]=s*v+u*p+d*m+e[14],t[15]=a*v+l*p+g*m+e[15])}(this,arguments.length>1&&void 0!==arguments[1]?arguments[1]:this,t),this}},{key:"rotate",value:function(t,e){return function(t,e,i,r){var n,s,a,h,o,u,l,c,f,d,g,v,p,m,y,_,b,x,E,w,k,M,A,T,F=r[0],R=r[1],S=r[2],C=Math.hypot(F,R,S);Math.abs(C)<1e-6||(F*=C=1/C,R*=C,S*=C,n=Math.sin(i),a=1-(s=Math.cos(i)),h=e[0],o=e[1],u=e[2],l=e[3],c=e[4],f=e[5],d=e[6],g=e[7],v=e[8],p=e[9],m=e[10],y=e[11],_=F*F*a+s,b=R*F*a+S*n,x=S*F*a-R*n,E=F*R*a-S*n,w=R*R*a+s,k=S*R*a+F*n,M=F*S*a+R*n,A=R*S*a-F*n,T=S*S*a+s,t[0]=h*_+c*b+v*x,t[1]=o*_+f*b+p*x,t[2]=u*_+d*b+m*x,t[3]=l*_+g*b+y*x,t[4]=h*E+c*w+v*k,t[5]=o*E+f*w+p*k,t[6]=u*E+d*w+m*k,t[7]=l*E+g*w+y*k,t[8]=h*M+c*A+v*T,t[9]=o*M+f*A+p*T,t[10]=u*M+d*A+m*T,t[11]=l*M+g*A+y*T,e!==t&&(t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15]))}(this,arguments.length>2&&void 0!==arguments[2]?arguments[2]:this,t,e),this}},{key:"scale",value:function(t){return function(t,e,i){var r=i[0],n=i[1],s=i[2];t[0]=e[0]*r,t[1]=e[1]*r,t[2]=e[2]*r,t[3]=e[3]*r,t[4]=e[4]*n,t[5]=e[5]*n,t[6]=e[6]*n,t[7]=e[7]*n,t[8]=e[8]*s,t[9]=e[9]*s,t[10]=e[10]*s,t[11]=e[11]*s,t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15]}(this,arguments.length>1&&void 0!==arguments[1]?arguments[1]:this,"number"==typeof t?[t,t,t]:t),this}},{key:"add",value:function(t,e){return e?tt(this,t,e):tt(this,this,t),this}},{key:"sub",value:function(t,e){return e?et(this,t,e):et(this,this,t),this}},{key:"multiply",value:function(t,e){var i,r,n;return t.length?e?Q(this,t,e):Q(this,this,t):(r=this,n=t,(i=this)[0]=r[0]*n,i[1]=r[1]*n,i[2]=r[2]*n,i[3]=r[3]*n,i[4]=r[4]*n,i[5]=r[5]*n,i[6]=r[6]*n,i[7]=r[7]*n,i[8]=r[8]*n,i[9]=r[9]*n,i[10]=r[10]*n,i[11]=r[11]*n,i[12]=r[12]*n,i[13]=r[13]*n,i[14]=r[14]*n,i[15]=r[15]*n),this}},{key:"identity",value:function(){var t;return(t=this)[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this}},{key:"copy",value:function(t){var e,i;return i=t,(e=this)[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],e[9]=i[9],e[10]=i[10],e[11]=i[11],e[12]=i[12],e[13]=i[13],e[14]=i[14],e[15]=i[15],this}},{key:"fromPerspective",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return function(t,e,i,r,n){var s=1/Math.tan(e/2),a=1/(r-n);t[0]=s/i,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=s,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=(n+r)*a,t[11]=-1,t[12]=0,t[13]=0,t[14]=2*n*r*a,t[15]=0}(this,t.fov,t.aspect,t.near,t.far),this}},{key:"fromOrthogonal",value:function(t){return function(t,e,i,r,n,s,a){var h=1/(e-i),o=1/(r-n),u=1/(s-a);t[0]=-2*h,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=-2*o,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=2*u,t[11]=0,t[12]=(e+i)*h,t[13]=(n+r)*o,t[14]=(a+s)*u,t[15]=1}(this,t.left,t.right,t.bottom,t.top,t.near,t.far),this}},{key:"fromQuaternion",value:function(t){return function(t,e){var i=e[0],r=e[1],n=e[2],s=e[3],a=i+i,h=r+r,o=n+n,u=i*a,l=r*a,c=r*h,f=n*a,d=n*h,g=n*o,v=s*a,p=s*h,m=s*o;t[0]=1-c-g,t[1]=l+m,t[2]=f-p,t[3]=0,t[4]=l-m,t[5]=1-u-g,t[6]=d+v,t[7]=0,t[8]=f+p,t[9]=d-v,t[10]=1-u-c,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1}(this,t),this}},{key:"setPosition",value:function(t){return this.x=t[0],this.y=t[1],this.z=t[2],this}},{key:"inverse",value:function(){var t,e,i,r,n,s,a,h,o,u,l,c,f,d,g,v,p,m,y,_,b,x,E,w,k,M,A,T,F,R,S;return t=this,i=(e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this)[0],r=e[1],n=e[2],s=e[3],a=e[4],h=e[5],o=e[6],u=e[7],l=e[8],c=e[9],f=e[10],d=e[11],g=e[12],v=e[13],p=e[14],m=e[15],(S=(y=i*h-r*a)*(R=f*m-d*p)-(_=i*o-n*a)*(F=c*m-d*v)+(b=i*u-s*a)*(T=c*p-f*v)+(x=r*o-n*h)*(A=l*m-d*g)-(E=r*u-s*h)*(M=l*p-f*g)+(w=n*u-s*o)*(k=l*v-c*g))&&(S=1/S,t[0]=(h*R-o*F+u*T)*S,t[1]=(n*F-r*R-s*T)*S,t[2]=(v*w-p*E+m*x)*S,t[3]=(f*E-c*w-d*x)*S,t[4]=(o*A-a*R-u*M)*S,t[5]=(i*R-n*A+s*M)*S,t[6]=(p*b-g*w-m*_)*S,t[7]=(l*w-f*b+d*_)*S,t[8]=(a*F-h*A+u*k)*S,t[9]=(r*A-i*F-s*k)*S,t[10]=(g*E-v*b+m*y)*S,t[11]=(c*b-l*E-d*y)*S,t[12]=(h*M-a*T-o*k)*S,t[13]=(i*T-r*M+n*k)*S,t[14]=(v*_-g*x-p*y)*S,t[15]=(l*x-c*_+f*y)*S),this}},{key:"compose",value:function(t,e,i){var r,n,s,a,h,o,u,l,c,f,d,g,v,p,m,y,_,b,x,E,w,k,M;return n=e,s=i,a=this,h=(r=t)[0],o=r[1],u=r[2],l=r[3],g=h*(c=h+h),v=h*(f=o+o),p=h*(d=u+u),m=o*f,y=o*d,_=u*d,b=l*c,x=l*f,E=l*d,w=s[0],k=s[1],M=s[2],a[0]=(1-(m+_))*w,a[1]=(v+E)*w,a[2]=(p-x)*w,a[3]=0,a[4]=(v-E)*k,a[5]=(1-(g+_))*k,a[6]=(y+b)*k,a[7]=0,a[8]=(p+x)*M,a[9]=(y-b)*M,a[10]=(1-(g+m))*M,a[11]=0,a[12]=n[0],a[13]=n[1],a[14]=n[2],a[15]=1,this}},{key:"decompose",value:function(t,e,i){return function(t,e,i,r){var n=p([t[0],t[1],t[2]]),s=p([t[4],t[5],t[6]]),a=p([t[8],t[9],t[10]]);Z(t)<0&&(n=-n),i[0]=t[12],i[1]=t[13],i[2]=t[14];var h=t.slice(),o=1/n,u=1/s,l=1/a;h[0]*=o,h[1]*=o,h[2]*=o,h[4]*=u,h[5]*=u,h[6]*=u,h[8]*=l,h[9]*=l,h[10]*=l,J(e,h),r[0]=n,r[1]=s,r[2]=a}(this,t,e,i),this}},{key:"getRotation",value:function(t){return J(t,this),this}},{key:"getTranslation",value:function(t){var e,i;return i=this,(e=t)[0]=i[12],e[1]=i[13],e[2]=i[14],this}},{key:"getScaling",value:function(t){return K(t,this),this}},{key:"getMaxScaleOnAxis",value:function(){return e=(t=this)[0],i=t[1],r=t[2],n=t[4],s=t[5],a=t[6],h=t[8],o=t[9],u=t[10],l=e*e+i*i+r*r,c=n*n+s*s+a*a,f=h*h+o*o+u*u,Math.sqrt(Math.max(l,c,f));var t,e,i,r,n,s,a,h,o,u,l,c,f}},{key:"lookAt",value:function(t,e,i){return function(t,e,i,r){var n=e[0],s=e[1],a=e[2],h=r[0],o=r[1],u=r[2],l=n-i[0],c=s-i[1],f=a-i[2],d=l*l+c*c+f*f;0===d?f=1:(l*=d=1/Math.sqrt(d),c*=d,f*=d);var g=o*f-u*c,v=u*l-h*f,p=h*c-o*l;0==(d=g*g+v*v+p*p)&&(u?h+=1e-6:o?u+=1e-6:o+=1e-6,d=(g=o*f-u*c)*g+(v=u*l-h*f)*v+(p=h*c-o*l)*p),g*=d=1/Math.sqrt(d),v*=d,p*=d,t[0]=g,t[1]=v,t[2]=p,t[3]=0,t[4]=c*p-f*v,t[5]=f*g-l*p,t[6]=l*v-c*g,t[7]=0,t[8]=l,t[9]=c,t[10]=f,t[11]=0,t[12]=n,t[13]=s,t[14]=a,t[15]=1}(this,t,e,i),this}},{key:"determinant",value:function(){return Z(this)}},{key:"fromArray",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return this[0]=t[e],this[1]=t[e+1],this[2]=t[e+2],this[3]=t[e+3],this[4]=t[e+4],this[5]=t[e+5],this[6]=t[e+6],this[7]=t[e+7],this[8]=t[e+8],this[9]=t[e+9],this[10]=t[e+10],this[11]=t[e+11],this[12]=t[e+12],this[13]=t[e+13],this[14]=t[e+14],this[15]=t[e+15],this}},{key:"toArray",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return t[e]=this[0],t[e+1]=this[1],t[e+2]=this[2],t[e+3]=this[3],t[e+4]=this[4],t[e+5]=this[5],t[e+6]=this[6],t[e+7]=this[7],t[e+8]=this[8],t[e+9]=this[9],t[e+10]=this[10],t[e+11]=this[11],t[e+12]=this[12],t[e+13]=this[13],t[e+14]=this[14],t[e+15]=this[15],t}}])}();var rt=new it,nt=function(t){function r(){var t,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:n,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:n,h=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"YXZ";i(this,r),(t=e(this,r,[n,s,a])).order=h,t.onChange=function(){},t._target=t;var o=["0","1","2"];return u(t,new Proxy(t,{set:function(t,e){var i=Reflect.set.apply(Reflect,arguments);return i&&o.includes(e)&&t.onChange(),i}}))}return h(r,v(Array)),n(r,[{key:"x",get:function(){return this[0]},set:function(t){this._target[0]=t,this.onChange()}},{key:"y",get:function(){return this[1]},set:function(t){this._target[1]=t,this.onChange()}},{key:"z",get:function(){return this[2]},set:function(t){this._target[2]=t,this.onChange()}},{key:"set",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t;return t.length?this.copy(t):(this._target[0]=t,this._target[1]=e,this._target[2]=i,this.onChange(),this)}},{key:"copy",value:function(t){return this._target[0]=t[0],this._target[1]=t[1],this._target[2]=t[2],this.onChange(),this}},{key:"reorder",value:function(t){return this._target.order=t,this.onChange(),this}},{key:"fromRotationMatrix",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.order;return function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"YXZ";"XYZ"===i?(t[1]=Math.asin(Math.min(Math.max(e[8],-1),1)),Math.abs(e[8])<.99999?(t[0]=Math.atan2(-e[9],e[10]),t[2]=Math.atan2(-e[4],e[0])):(t[0]=Math.atan2(e[6],e[5]),t[2]=0)):"YXZ"===i?(t[0]=Math.asin(-Math.min(Math.max(e[9],-1),1)),Math.abs(e[9])<.99999?(t[1]=Math.atan2(e[8],e[10]),t[2]=Math.atan2(e[1],e[5])):(t[1]=Math.atan2(-e[2],e[0]),t[2]=0)):"ZXY"===i?(t[0]=Math.asin(Math.min(Math.max(e[6],-1),1)),Math.abs(e[6])<.99999?(t[1]=Math.atan2(-e[2],e[10]),t[2]=Math.atan2(-e[4],e[5])):(t[1]=0,t[2]=Math.atan2(e[1],e[0]))):"ZYX"===i?(t[1]=Math.asin(-Math.min(Math.max(e[2],-1),1)),Math.abs(e[2])<.99999?(t[0]=Math.atan2(e[6],e[10]),t[2]=Math.atan2(e[1],e[0])):(t[0]=0,t[2]=Math.atan2(-e[4],e[5]))):"YZX"===i?(t[2]=Math.asin(Math.min(Math.max(e[1],-1),1)),Math.abs(e[1])<.99999?(t[0]=Math.atan2(-e[9],e[5]),t[1]=Math.atan2(-e[2],e[0])):(t[0]=0,t[1]=Math.atan2(e[8],e[10]))):"XZY"===i&&(t[2]=Math.asin(-Math.min(Math.max(e[4],-1),1)),Math.abs(e[4])<.99999?(t[0]=Math.atan2(e[6],e[5]),t[1]=Math.atan2(e[8],e[0])):(t[0]=Math.atan2(-e[9],e[10]),t[1]=0))}(this._target,t,e),this.onChange(),this}},{key:"fromQuaternion",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.order,i=arguments.length>2?arguments[2]:void 0;return rt.fromQuaternion(t),this._target.fromRotationMatrix(rt,e),i||this.onChange(),this}},{key:"fromArray",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return this._target[0]=t[e],this._target[1]=t[e+1],this._target[2]=t[e+2],this}},{key:"toArray",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return t[e]=this[0],t[e+1]=this[1],t[e+2]=this[2],t}}])}(),st=function(){return n((function t(){var e=this;i(this,t),this.parent=null,this.children=[],this.visible=!0,this.matrix=new it,this.worldMatrix=new it,this.matrixAutoUpdate=!0,this.worldMatrixNeedsUpdate=!1,this.position=new F,this.quaternion=new Y,this.scale=new F(1),this.rotation=new nt,this.up=new F(0,1,0),this.rotation._target.onChange=function(){return e.quaternion.fromEuler(e.rotation,!0)},this.quaternion._target.onChange=function(){return e.rotation.fromQuaternion(e.quaternion,void 0,!0)}}),[{key:"setParent",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];this.parent&&t!==this.parent&&this.parent.removeChild(this,!1),this.parent=t,e&&t&&t.addChild(this,!1)}},{key:"addChild",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];~this.children.indexOf(t)||this.children.push(t),e&&t.setParent(this,!1)}},{key:"removeChild",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];~this.children.indexOf(t)&&this.children.splice(this.children.indexOf(t),1),e&&t.setParent(null,!1)}},{key:"updateMatrixWorld",value:function(t){this.matrixAutoUpdate&&this.updateMatrix(),(this.worldMatrixNeedsUpdate||t)&&(null===this.parent?this.worldMatrix.copy(this.matrix):this.worldMatrix.multiply(this.parent.worldMatrix,this.matrix),this.worldMatrixNeedsUpdate=!1,t=!0);for(var e=0,i=this.children.length;e1&&void 0!==arguments[1]&&arguments[1]?this.matrix.lookAt(this.position,t,this.up):this.matrix.lookAt(t,this.position,this.up),this.matrix.getRotation(this.quaternion._target),this.rotation.fromQuaternion(this.quaternion)}}])}(),at=new it,ht=new F,ot=new F,ut=function(t){function r(t){var n,s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=s.near,h=void 0===a?.1:a,o=s.far,u=void 0===o?100:o,l=s.fov,c=void 0===l?45:l,f=s.aspect,d=void 0===f?1:f,g=s.left,v=s.right,p=s.bottom,m=s.top,y=s.zoom,_=void 0===y?1:y;return i(this,r),n=e(this,r),Object.assign(n,{near:h,far:u,fov:c,aspect:d,left:g,right:v,bottom:p,top:m,zoom:_}),n.projectionMatrix=new it,n.viewMatrix=new it,n.projectionViewMatrix=new it,n.worldPosition=new F,n.type=g||v?"orthographic":"perspective","orthographic"===n.type?n.orthographic():n.perspective(),n}return h(r,st),n(r,[{key:"perspective",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=t.near,i=void 0===e?this.near:e,r=t.far,n=void 0===r?this.far:r,s=t.fov,a=void 0===s?this.fov:s,h=t.aspect,o=void 0===h?this.aspect:h;return Object.assign(this,{near:i,far:n,fov:a,aspect:o}),this.projectionMatrix.fromPerspective({fov:a*(Math.PI/180),aspect:o,near:i,far:n}),this.type="perspective",this}},{key:"orthographic",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=t.near,i=void 0===e?this.near:e,r=t.far,n=void 0===r?this.far:r,s=t.left,a=void 0===s?this.left||-1:s,h=t.right,o=void 0===h?this.right||1:h,u=t.bottom,l=void 0===u?this.bottom||-1:u,c=t.top,f=void 0===c?this.top||1:c,d=t.zoom,g=void 0===d?this.zoom:d;return Object.assign(this,{near:i,far:n,left:a,right:o,bottom:l,top:f,zoom:g}),a/=g,o/=g,l/=g,f/=g,this.projectionMatrix.fromOrthogonal({left:a,right:o,bottom:l,top:f,near:i,far:n}),this.type="orthographic",this}},{key:"updateMatrixWorld",value:function(){return s(a(r.prototype),"updateMatrixWorld",this).call(this),this.viewMatrix.inverse(this.worldMatrix),this.worldMatrix.getTranslation(this.worldPosition),this.projectionViewMatrix.multiply(this.projectionMatrix,this.viewMatrix),this}},{key:"lookAt",value:function(t){return s(a(r.prototype),"lookAt",this).call(this,t,!0),this}},{key:"project",value:function(t){return t.applyMatrix4(this.viewMatrix),t.applyMatrix4(this.projectionMatrix),this}},{key:"unproject",value:function(t){return t.applyMatrix4(at.inverse(this.projectionMatrix)),t.applyMatrix4(this.worldMatrix),this}},{key:"updateFrustum",value:function(){this.frustum||(this.frustum=[new F,new F,new F,new F,new F,new F]);var t=this.projectionViewMatrix;this.frustum[0].set(t[3]-t[0],t[7]-t[4],t[11]-t[8]).constant=t[15]-t[12],this.frustum[1].set(t[3]+t[0],t[7]+t[4],t[11]+t[8]).constant=t[15]+t[12],this.frustum[2].set(t[3]+t[1],t[7]+t[5],t[11]+t[9]).constant=t[15]+t[13],this.frustum[3].set(t[3]-t[1],t[7]-t[5],t[11]-t[9]).constant=t[15]-t[13],this.frustum[4].set(t[3]-t[2],t[7]-t[6],t[11]-t[10]).constant=t[15]-t[14],this.frustum[5].set(t[3]+t[2],t[7]+t[6],t[11]+t[10]).constant=t[15]+t[14];for(var e=0;e<6;e++){var i=1/this.frustum[e].distance();this.frustum[e].multiply(i),this.frustum[e].constant*=i}}},{key:"frustumIntersectsMesh",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t.worldMatrix;if(!t.geometry.attributes.position)return!0;if(t.geometry.bounds&&t.geometry.bounds.radius!==1/0||t.geometry.computeBoundingSphere(),!t.geometry.bounds)return!0;var i=ht;i.copy(t.geometry.bounds.center),i.applyMatrix4(e);var r=t.geometry.bounds.radius*e.getMaxScaleOnAxis();return this.frustumIntersectsSphere(i,r)}},{key:"frustumIntersectsSphere",value:function(t,e){for(var i=ot,r=0;r<6;r++){var n=this.frustum[r];if(i.copy(n).dot(t)+n.constant<-e)return!1}return!0}}])}();function lt(t,e,i){var r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],o=e[5],u=e[6],l=e[7],c=e[8],f=i[0],d=i[1],g=i[2],v=i[3],p=i[4],m=i[5],y=i[6],_=i[7],b=i[8];return t[0]=f*r+d*a+g*u,t[1]=f*n+d*h+g*l,t[2]=f*s+d*o+g*c,t[3]=v*r+p*a+m*u,t[4]=v*n+p*h+m*l,t[5]=v*s+p*o+m*c,t[6]=y*r+_*a+b*u,t[7]=y*n+_*h+b*l,t[8]=y*s+_*o+b*c,t}var ct=function(t){function r(){var t,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1,s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,h=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:1,l=arguments.length>5&&void 0!==arguments[5]?arguments[5]:0,c=arguments.length>6&&void 0!==arguments[6]?arguments[6]:0,f=arguments.length>7&&void 0!==arguments[7]?arguments[7]:0,d=arguments.length>8&&void 0!==arguments[8]?arguments[8]:1;return i(this,r),u(t=e(this,r,[n,s,a,h,o,l,c,f,d]),t)}return h(r,v(Array)),n(r,[{key:"set",value:function(t,e,i,r,n,s,a,h,o){return t.length?this.copy(t):(function(t,e,i,r,n,s,a,h,o,u){t[0]=e,t[1]=i,t[2]=r,t[3]=n,t[4]=s,t[5]=a,t[6]=h,t[7]=o,t[8]=u}(this,t,e,i,r,n,s,a,h,o),this)}},{key:"translate",value:function(t){return function(t,e,i){var r=e[0],n=e[1],s=e[2],a=e[3],h=e[4],o=e[5],u=e[6],l=e[7],c=e[8],f=i[0],d=i[1];t[0]=r,t[1]=n,t[2]=s,t[3]=a,t[4]=h,t[5]=o,t[6]=f*r+d*a+u,t[7]=f*n+d*h+l,t[8]=f*s+d*o+c}(this,arguments.length>1&&void 0!==arguments[1]?arguments[1]:this,t),this}},{key:"rotate",value:function(t){var e,i,r,n,s,a,h,o,u,l,c,f,d,g;return e=this,r=t,n=(i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this)[0],s=i[1],a=i[2],h=i[3],o=i[4],u=i[5],l=i[6],c=i[7],f=i[8],d=Math.sin(r),g=Math.cos(r),e[0]=g*n+d*h,e[1]=g*s+d*o,e[2]=g*a+d*u,e[3]=g*h-d*n,e[4]=g*o-d*s,e[5]=g*u-d*a,e[6]=l,e[7]=c,e[8]=f,this}},{key:"scale",value:function(t){return function(t,e,i){var r=i[0],n=i[1];t[0]=r*e[0],t[1]=r*e[1],t[2]=r*e[2],t[3]=n*e[3],t[4]=n*e[4],t[5]=n*e[5],t[6]=e[6],t[7]=e[7],t[8]=e[8]}(this,arguments.length>1&&void 0!==arguments[1]?arguments[1]:this,t),this}},{key:"multiply",value:function(t,e){return e?lt(this,t,e):lt(this,this,t),this}},{key:"identity",value:function(){var t;return(t=this)[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,this}},{key:"copy",value:function(t){var e,i;return i=t,(e=this)[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[3],e[4]=i[4],e[5]=i[5],e[6]=i[6],e[7]=i[7],e[8]=i[8],this}},{key:"fromMatrix4",value:function(t){var e,i;return i=t,(e=this)[0]=i[0],e[1]=i[1],e[2]=i[2],e[3]=i[4],e[4]=i[5],e[5]=i[6],e[6]=i[8],e[7]=i[9],e[8]=i[10],this}},{key:"fromQuaternion",value:function(t){return function(t,e){var i=e[0],r=e[1],n=e[2],s=e[3],a=i+i,h=r+r,o=n+n,u=i*a,l=r*a,c=r*h,f=n*a,d=n*h,g=n*o,v=s*a,p=s*h,m=s*o;t[0]=1-c-g,t[3]=l-m,t[6]=f+p,t[1]=l+m,t[4]=1-u-g,t[7]=d-v,t[2]=f-p,t[5]=d+v,t[8]=1-u-c}(this,t),this}},{key:"fromBasis",value:function(t,e,i){return this.set(t[0],t[1],t[2],e[0],e[1],e[2],i[0],i[1],i[2]),this}},{key:"inverse",value:function(){var t,e,i,r,n,s,a,h,o,u,l,c,f,d,g;return t=this,i=(e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this)[0],r=e[1],n=e[2],s=e[3],a=e[4],h=e[5],o=e[6],u=e[7],l=e[8],(g=i*(c=l*a-h*u)+r*(f=-l*s+h*o)+n*(d=u*s-a*o))&&(g=1/g,t[0]=c*g,t[1]=(-l*r+n*u)*g,t[2]=(h*r-n*a)*g,t[3]=f*g,t[4]=(l*i-n*o)*g,t[5]=(-h*i+n*s)*g,t[6]=d*g,t[7]=(-u*i+r*o)*g,t[8]=(a*i-r*s)*g),this}},{key:"getNormalMatrix",value:function(t){var e,i,r,n,s,a,h,o,u,l,c,f,d,g,v,p,m,y,_,b,x,E,w,k,M,A,T,F,R,S,C;return e=this,r=(i=t)[0],n=i[1],s=i[2],a=i[3],h=i[4],o=i[5],u=i[6],l=i[7],c=i[8],f=i[9],d=i[10],g=i[11],v=i[12],p=i[13],m=i[14],y=i[15],(C=(_=r*o-n*h)*(S=d*y-g*m)-(b=r*u-s*h)*(R=f*y-g*p)+(x=r*l-a*h)*(F=f*m-d*p)+(E=n*u-s*o)*(T=c*y-g*v)-(w=n*l-a*o)*(A=c*m-d*v)+(k=s*l-a*u)*(M=c*p-f*v))&&(C=1/C,e[0]=(o*S-u*R+l*F)*C,e[1]=(u*T-h*S-l*A)*C,e[2]=(h*R-o*T+l*M)*C,e[3]=(s*R-n*S-a*F)*C,e[4]=(r*S-s*T+a*A)*C,e[5]=(n*T-r*R-a*M)*C,e[6]=(p*k-m*w+y*E)*C,e[7]=(m*x-v*k-y*b)*C,e[8]=(v*w-p*x+y*_)*C),this}}])}(),ft=0,dt=function(t){function r(t){var n,s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=s.geometry,h=s.program,o=s.mode,u=void 0===o?t.TRIANGLES:o,l=s.frustumCulled,c=void 0===l||l,f=s.renderOrder,d=void 0===f?0:f;return i(this,r),n=e(this,r),t.canvas,n.gl=t,n.id=ft++,n.geometry=a,n.program=h,n.mode=u,n.frustumCulled=c,n.renderOrder=d,n.modelViewMatrix=new it,n.normalMatrix=new ct,n.beforeRenderCallbacks=[],n.afterRenderCallbacks=[],n}return h(r,st),n(r,[{key:"onBeforeRender",value:function(t){return this.beforeRenderCallbacks.push(t),this}},{key:"onAfterRender",value:function(t){return this.afterRenderCallbacks.push(t),this}},{key:"draw",value:function(){var t=this,e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}).camera;e&&(this.program.uniforms.modelMatrix||Object.assign(this.program.uniforms,{modelMatrix:{value:null},viewMatrix:{value:null},modelViewMatrix:{value:null},normalMatrix:{value:null},projectionMatrix:{value:null},cameraPosition:{value:null}}),this.program.uniforms.projectionMatrix.value=e.projectionMatrix,this.program.uniforms.cameraPosition.value=e.worldPosition,this.program.uniforms.viewMatrix.value=e.viewMatrix,this.modelViewMatrix.multiply(e.viewMatrix,this.worldMatrix),this.normalMatrix.getNormalMatrix(this.modelViewMatrix),this.program.uniforms.modelMatrix.value=this.worldMatrix,this.program.uniforms.modelViewMatrix.value=this.modelViewMatrix,this.program.uniforms.normalMatrix.value=this.normalMatrix),this.beforeRenderCallbacks.forEach((function(i){return i&&i({mesh:t,camera:e})}));var i=this.program.cullFace&&this.worldMatrix.determinant()<0;this.program.use({flipFaces:i}),this.geometry.draw({mode:this.mode,program:this.program}),this.afterRenderCallbacks.forEach((function(i){return i&&i({mesh:t,camera:e})}))}}])}(),gt=new Uint8Array(4);function vt(t){return!(t&t-1)}var pt=1,mt=function(){return n((function t(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=r.image,s=r.target,a=void 0===s?e.TEXTURE_2D:s,h=r.type,o=void 0===h?e.UNSIGNED_BYTE:h,u=r.format,l=void 0===u?e.RGBA:u,c=r.internalFormat,f=void 0===c?l:c,d=r.wrapS,g=void 0===d?e.CLAMP_TO_EDGE:d,v=r.wrapT,p=void 0===v?e.CLAMP_TO_EDGE:v,m=r.generateMipmaps,y=void 0===m||m,_=r.minFilter,b=void 0===_?y?e.NEAREST_MIPMAP_LINEAR:e.LINEAR:_,x=r.magFilter,E=void 0===x?e.LINEAR:x,w=r.premultiplyAlpha,k=void 0!==w&&w,M=r.unpackAlignment,A=void 0===M?4:M,T=r.flipY,F=void 0===T?a==e.TEXTURE_2D:T,R=r.anisotropy,S=void 0===R?0:R,C=r.level,P=void 0===C?0:C,O=r.width,B=r.height,N=void 0===B?O:B;i(this,t),this.gl=e,this.id=pt++,this.image=n,this.target=a,this.type=o,this.format=l,this.internalFormat=f,this.minFilter=b,this.magFilter=E,this.wrapS=g,this.wrapT=p,this.generateMipmaps=y,this.premultiplyAlpha=k,this.unpackAlignment=A,this.flipY=F,this.anisotropy=Math.min(S,this.gl.renderer.parameters.maxAnisotropy),this.level=P,this.width=O,this.height=N,this.texture=this.gl.createTexture(),this.store={image:null},this.glState=this.gl.renderer.state,this.state={},this.state.minFilter=this.gl.NEAREST_MIPMAP_LINEAR,this.state.magFilter=this.gl.LINEAR,this.state.wrapS=this.gl.REPEAT,this.state.wrapT=this.gl.REPEAT,this.state.anisotropy=0}),[{key:"bind",value:function(){this.glState.textureUnits[this.glState.activeTextureUnit]!==this.id&&(this.gl.bindTexture(this.target,this.texture),this.glState.textureUnits[this.glState.activeTextureUnit]=this.id)}},{key:"update",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=!(this.image===this.store.image&&!this.needsUpdate);if((e||this.glState.textureUnits[t]!==this.id)&&(this.gl.renderer.activeTexture(t),this.bind()),e){if(this.needsUpdate=!1,this.flipY!==this.glState.flipY&&(this.gl.pixelStorei(this.gl.UNPACK_FLIP_Y_WEBGL,this.flipY),this.glState.flipY=this.flipY),this.premultiplyAlpha!==this.glState.premultiplyAlpha&&(this.gl.pixelStorei(this.gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL,this.premultiplyAlpha),this.glState.premultiplyAlpha=this.premultiplyAlpha),this.unpackAlignment!==this.glState.unpackAlignment&&(this.gl.pixelStorei(this.gl.UNPACK_ALIGNMENT,this.unpackAlignment),this.glState.unpackAlignment=this.unpackAlignment),this.minFilter!==this.state.minFilter&&(this.gl.texParameteri(this.target,this.gl.TEXTURE_MIN_FILTER,this.minFilter),this.state.minFilter=this.minFilter),this.magFilter!==this.state.magFilter&&(this.gl.texParameteri(this.target,this.gl.TEXTURE_MAG_FILTER,this.magFilter),this.state.magFilter=this.magFilter),this.wrapS!==this.state.wrapS&&(this.gl.texParameteri(this.target,this.gl.TEXTURE_WRAP_S,this.wrapS),this.state.wrapS=this.wrapS),this.wrapT!==this.state.wrapT&&(this.gl.texParameteri(this.target,this.gl.TEXTURE_WRAP_T,this.wrapT),this.state.wrapT=this.wrapT),this.anisotropy&&this.anisotropy!==this.state.anisotropy&&(this.gl.texParameterf(this.target,this.gl.renderer.getExtension("EXT_texture_filter_anisotropic").TEXTURE_MAX_ANISOTROPY_EXT,this.anisotropy),this.state.anisotropy=this.anisotropy),this.image){if(this.image.width&&(this.width=this.image.width,this.height=this.image.height),this.target===this.gl.TEXTURE_CUBE_MAP)for(var i=0;i<6;i++)this.gl.texImage2D(this.gl.TEXTURE_CUBE_MAP_POSITIVE_X+i,this.level,this.internalFormat,this.format,this.type,this.image[i]);else if(ArrayBuffer.isView(this.image))this.gl.texImage2D(this.target,this.level,this.internalFormat,this.width,this.height,0,this.format,this.type,this.image);else if(this.image.isCompressedTexture)for(var r=0;r1&&void 0!==arguments[1]?arguments[1]:{},n=r.width,s=void 0===n?e.canvas.width:n,a=r.height,h=void 0===a?e.canvas.height:a,o=r.target,u=void 0===o?e.FRAMEBUFFER:o,l=r.color,c=void 0===l?1:l,f=r.depth,d=void 0===f||f,g=r.stencil,v=void 0!==g&&g,p=r.depthTexture,m=void 0!==p&&p,y=r.wrapS,_=void 0===y?e.CLAMP_TO_EDGE:y,b=r.wrapT,x=void 0===b?e.CLAMP_TO_EDGE:b,E=r.minFilter,w=void 0===E?e.LINEAR:E,k=r.magFilter,M=void 0===k?w:k,A=r.type,T=void 0===A?e.UNSIGNED_BYTE:A,F=r.format,R=void 0===F?e.RGBA:F,S=r.internalFormat,C=void 0===S?R:S,P=r.unpackAlignment,O=r.premultiplyAlpha;i(this,t),this.gl=e,this.width=s,this.height=h,this.depth=d,this.buffer=this.gl.createFramebuffer(),this.target=u,this.gl.renderer.bindFramebuffer(this),this.textures=[];for(var B=[],N=0;N1&&this.gl.renderer.drawBuffers(B),this.texture=this.textures[0],m&&(this.gl.renderer.isWebgl2||this.gl.renderer.getExtension("WEBGL_depth_texture"))?(this.depthTexture=new mt(e,{width:s,height:h,minFilter:this.gl.NEAREST,magFilter:this.gl.NEAREST,format:this.gl.DEPTH_COMPONENT,internalFormat:e.renderer.isWebgl2?this.gl.DEPTH_COMPONENT16:this.gl.DEPTH_COMPONENT,type:this.gl.UNSIGNED_INT}),this.depthTexture.update(),this.gl.framebufferTexture2D(this.target,this.gl.DEPTH_ATTACHMENT,this.gl.TEXTURE_2D,this.depthTexture.texture,0)):(d&&!v&&(this.depthBuffer=this.gl.createRenderbuffer(),this.gl.bindRenderbuffer(this.gl.RENDERBUFFER,this.depthBuffer),this.gl.renderbufferStorage(this.gl.RENDERBUFFER,this.gl.DEPTH_COMPONENT16,s,h),this.gl.framebufferRenderbuffer(this.target,this.gl.DEPTH_ATTACHMENT,this.gl.RENDERBUFFER,this.depthBuffer)),v&&!d&&(this.stencilBuffer=this.gl.createRenderbuffer(),this.gl.bindRenderbuffer(this.gl.RENDERBUFFER,this.stencilBuffer),this.gl.renderbufferStorage(this.gl.RENDERBUFFER,this.gl.STENCIL_INDEX8,s,h),this.gl.framebufferRenderbuffer(this.target,this.gl.STENCIL_ATTACHMENT,this.gl.RENDERBUFFER,this.stencilBuffer)),d&&v&&(this.depthStencilBuffer=this.gl.createRenderbuffer(),this.gl.bindRenderbuffer(this.gl.RENDERBUFFER,this.depthStencilBuffer),this.gl.renderbufferStorage(this.gl.RENDERBUFFER,this.gl.DEPTH_STENCIL,s,h),this.gl.framebufferRenderbuffer(this.target,this.gl.DEPTH_STENCIL_ATTACHMENT,this.gl.RENDERBUFFER,this.depthStencilBuffer))),this.gl.renderer.bindFramebuffer({target:this.target})}),[{key:"setSize",value:function(t,e){if(this.width!==t||this.height!==e){this.width=t,this.height=e,this.gl.renderer.bindFramebuffer(this);for(var i=0;i>16&255)/255,(t>>8&255)/255,(255&t)/255]}function Et(t){return void 0===t?[0,0,0]:3===arguments.length?arguments:isNaN(t)?"#"===t[0]?bt(t):_t[t.toLowerCase()]?bt(_t[t.toLowerCase()]):[0,0,0]:xt(t)}var wt=Object.freeze({__proto__:null,hexToRGB:bt,numberToRGB:xt,parseColor:Et}),kt=function(t){function r(t){var n;return i(this,r),Array.isArray(t)?u(n,n=e(this,r,c(t))):u(n,n=e(this,r,c(Et.apply(wt,arguments))))}return h(r,v(Array)),n(r,[{key:"r",get:function(){return this[0]},set:function(t){this[0]=t}},{key:"g",get:function(){return this[1]},set:function(t){this[1]=t}},{key:"b",get:function(){return this[2]},set:function(t){this[2]=t}},{key:"set",value:function(t){return Array.isArray(t)?this.copy(t):this.copy(Et.apply(wt,arguments))}},{key:"copy",value:function(t){return this[0]=t[0],this[1]=t[1],this[2]=t[2],this}}])}();function Mt(t,e,i){return t[0]=e[0]+i[0],t[1]=e[1]+i[1],t}function At(t,e,i){return t[0]=e[0]-i[0],t[1]=e[1]-i[1],t}function Tt(t,e,i){return t[0]=e[0]*i,t[1]=e[1]*i,t}function Ft(t){var e=t[0],i=t[1];return Math.sqrt(e*e+i*i)}function Rt(t,e){return t[0]*e[1]-t[1]*e[0]}var St=function(t){function r(){var t,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:n;return i(this,r),u(t=e(this,r,[n,s]),t)}return h(r,v(Array)),n(r,[{key:"x",get:function(){return this[0]},set:function(t){this[0]=t}},{key:"y",get:function(){return this[1]},set:function(t){this[1]=t}},{key:"set",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:t;return t.length?this.copy(t):(function(t,e,i){t[0]=e,t[1]=i}(this,t,e),this)}},{key:"copy",value:function(t){var e,i;return i=t,(e=this)[0]=i[0],e[1]=i[1],this}},{key:"add",value:function(t,e){return e?Mt(this,t,e):Mt(this,this,t),this}},{key:"sub",value:function(t,e){return e?At(this,t,e):At(this,this,t),this}},{key:"multiply",value:function(t){var e,i,r;return t.length?(i=this,r=t,(e=this)[0]=i[0]*r[0],e[1]=i[1]*r[1]):Tt(this,this,t),this}},{key:"divide",value:function(t){var e,i,r;return t.length?(i=this,r=t,(e=this)[0]=i[0]/r[0],e[1]=i[1]/r[1]):Tt(this,this,1/t),this}},{key:"inverse",value:function(){var t,e;return e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this,(t=this)[0]=1/e[0],t[1]=1/e[1],this}},{key:"len",value:function(){return Ft(this)}},{key:"distance",value:function(t){return t?(e=this,r=(i=t)[0]-e[0],n=i[1]-e[1],Math.sqrt(r*r+n*n)):Ft(this);var e,i,r,n}},{key:"squaredLen",value:function(){return this.squaredDistance()}},{key:"squaredDistance",value:function(t){return t?(e=this,r=(i=t)[0]-e[0],n=i[1]-e[1],r*r+n*n):function(t){var e=t[0],i=t[1];return e*e+i*i}(this);var e,i,r,n}},{key:"negate",value:function(){var t,e;return e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this,(t=this)[0]=-e[0],t[1]=-e[1],this}},{key:"cross",value:function(t,e){return e?Rt(t,e):Rt(this,t)}},{key:"scale",value:function(t){return Tt(this,this,t),this}},{key:"normalize",value:function(){var t,e,i,r,n;return t=this,i=(e=this)[0],r=e[1],(n=i*i+r*r)>0&&(n=1/Math.sqrt(n)),t[0]=e[0]*n,t[1]=e[1]*n,this}},{key:"dot",value:function(t){return i=t,(e=this)[0]*i[0]+e[1]*i[1];var e,i}},{key:"equals",value:function(t){return i=t,(e=this)[0]===i[0]&&e[1]===i[1];var e,i}},{key:"applyMatrix3",value:function(t){var e,i,r,n,s;return e=this,r=t,n=(i=this)[0],s=i[1],e[0]=r[0]*n+r[3]*s+r[6],e[1]=r[1]*n+r[4]*s+r[7],this}},{key:"applyMatrix4",value:function(t){var e,i,r,n,s;return e=this,r=t,n=(i=this)[0],s=i[1],e[0]=r[0]*n+r[4]*s+r[12],e[1]=r[1]*n+r[5]*s+r[13],this}},{key:"lerp",value:function(t,e){return function(t,e,i,r){var n=e[0],s=e[1];t[0]=n+r*(i[0]-n),t[1]=s+r*(i[1]-s)}(this,this,t,e),this}},{key:"clone",value:function(){return new r(this[0],this[1])}},{key:"fromArray",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return this[0]=t[e],this[1]=t[e+1],this}},{key:"toArray",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return t[e]=this[0],t[e+1]=this[1],t}}])}(),Ct=function(t){function r(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},s=n.width,a=void 0===s?1:s,h=n.height,o=void 0===h?1:h,u=n.widthSegments,l=void 0===u?1:u,c=n.heightSegments,f=void 0===c?1:c,d=n.attributes,g=void 0===d?{}:d;i(this,r);var v=l,p=f,m=(v+1)*(p+1),y=v*p*6,_=new Float32Array(3*m),b=new Float32Array(3*m),x=new Float32Array(2*m),E=y>65536?new Uint32Array(y):new Uint16Array(y);return r.buildPlane(_,b,x,E,a,o,0,v,p),Object.assign(g,{position:{size:3,data:_},normal:{size:3,data:b},uv:{size:2,data:x},index:{data:E}}),e(this,r,[t,g])}return h(r,O),n(r,null,[{key:"buildPlane",value:function(t,e,i,r,n,s,a,h,o){for(var u=arguments.length>9&&void 0!==arguments[9]?arguments[9]:0,l=arguments.length>10&&void 0!==arguments[10]?arguments[10]:1,c=arguments.length>11&&void 0!==arguments[11]?arguments[11]:2,f=arguments.length>12&&void 0!==arguments[12]?arguments[12]:1,d=arguments.length>13&&void 0!==arguments[13]?arguments[13]:-1,g=arguments.length>14&&void 0!==arguments[14]?arguments[14]:0,v=arguments.length>15&&void 0!==arguments[15]?arguments[15]:0,p=g,m=n/h,y=s/o,_=0;_<=o;_++)for(var b=_*y-s/2,x=0;x<=h;x++,g++){var E=x*m-n/2;if(t[3*g+u]=E*f,t[3*g+l]=b*d,t[3*g+c]=a/2,e[3*g+u]=0,e[3*g+l]=0,e[3*g+c]=a>=0?1:-1,i[2*g]=x/h,i[2*g+1]=1-_/o,_!==o&&x!==h){var w=p+x+_*(h+1),k=p+x+(_+1)*(h+1),M=p+x+(_+1)*(h+1)+1,A=p+x+_*(h+1)+1;r[6*v]=w,r[6*v+1]=k,r[6*v+2]=A,r[6*v+3]=k,r[6*v+4]=M,r[6*v+5]=A,v++}}}}])}();!function(){!function(t,e,i){var r,n=256,s="random",a=i.pow(n,6),h=i.pow(2,52),o=2*h,u=n-1;function l(u,l,d){var m=[],y=v(g((l=1==l?{entropy:!0}:l||{}).entropy?[u,p(e)]:null==u?function(){try{var i;return r&&(i=r.randomBytes)?i=i(n):(i=new Uint8Array(n),(t.crypto||t.msCrypto).getRandomValues(i)),p(i)}catch(i){var s=t.navigator,a=s&&s.plugins;return[+new Date,t,a,t.screen,p(e)]}}():u,3),m),_=new c(m),b=function(){for(var t=_.g(6),e=a,i=0;t=o;)t/=2,e/=2,i>>>=1;return(t+i)/e};return b.int32=function(){return 0|_.g(4)},b.quick=function(){return _.g(4)/4294967296},b.double=b,v(p(_.S),e),(l.pass||d||function(t,e,r,n){return n&&(n.S&&f(n,_),t.state=function(){return f(_,{})}),r?(i[s]=t,e):t})(b,y,"global"in l?l.global:this==i,l.state)}function c(t){var e,i=t.length,r=this,s=0,a=r.i=r.j=0,h=r.S=[];for(i||(t=[i++]);s0&&void 0!==arguments[0]?arguments[0]:{},h=arguments.length>1?arguments[1]:void 0;i(this,t),e=this,n=function(){requestAnimationFrame(s._update),s.loop&&(s.frame++,s._animate()),s.gl.clearColor(0,0,0,1),s.renderer.render({scene:s.scene,camera:s.camera}),s.isRenderTarget&&(s.gl.clearColor(0,0,0,1),s.renderer.render({scene:s.rttPlane,camera:s.rttCamera,target:s.rtt}))},(r=f(r="_update"))in e?Object.defineProperty(e,r,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[r]=n,this.params=a,this.options={},this.loop=a.loop||!1,this.colors_num=h,this.colors_init=a.colors||[],this.palette=[],this.colors(this.colors_init),this.seed=a.seed||1e3,this.rng=new Math.seedrandom(this.seed),this.frame=0,this.parentDom=a.dom?document.getElementById(a.dom):document.body,"static"===window.getComputedStyle(this.parentDom).position&&(this.parentDom.style.position="relative");var o=this._getParentRect(this.parentDom);this.canvasW=o.w,this.canvasH=o.h,this.renderer=new q,this.renderer.setSize(this.canvasW,this.canvasH),this.gl=this.renderer.gl,this.gl.canvas.id="colorbgcanvas",this.gl.canvas.style.position="absolute",this.gl.canvas.style.top=0,this.gl.canvas.style.left=0,this.gl.canvas.style.zIndex=0,this.parentDom.appendChild(this.gl.canvas),this.camera=new ut(this.gl,{near:.1,far:10001,left:-this.canvasW/2,right:this.canvasW/2,bottom:-this.canvasH/2,top:this.canvasH/2,zoom:1}),this.camera.position.z=8e3,this.isRenderTarget=!1,this.scene=new st}),[{key:"_getParentRect",value:function(t){var e=t;return{w:e.getBoundingClientRect().width,h:e.getBoundingClientRect().height}}},{key:"colors",value:function(t){var e=!!this.palette.length;if(this.palette=[],0==t.length)this.palette=["#F00911","#F3AA00","#F6EE0B","#39E90D","#195ED2","#F00911"];else if(t.length=0;t--)this.scene.removeChild(this.scene.children[t])}},{key:"_size",value:function(){}},{key:"_initRtt",value:function(){}},{key:"_resetSeed",value:function(){}},{key:"_animate",value:function(){}},{key:"destroy",value:function(){this._delete(),this.parentDom.removeChild(this.gl.canvas)}}])}(),Ot=function(t){function r(){var t,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return i(this,r),(t=e(this,r,[n,6])).name="grid-array",t.speed=56,t.start(),t}return h(r,Pt),n(r,[{key:"_initRtt",value:function(){this.rtt=new yt(this.gl,{width:2*this.canvasW,height:2*this.canvasH}),this.rttCamera=new ut(this.gl,{left:-.5,right:.5,bottom:-.5,top:.5,zoom:1}),this.rttCamera.position.z=1,this.rttPlaneGeo=new Ct(this.gl,{}),this.rttProgram=new U(this.gl,{vertex:"\n attribute vec3 position;\n attribute vec2 uv;\n uniform mat4 modelViewMatrix;\n uniform mat4 projectionMatrix;\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n ",fragment:"\nprecision mediump float;\n\nuniform float u_time;\nuniform vec2 u_resolution;\n\nuniform float u_scale;\nuniform float u_seed;\nuniform float u_w;\nuniform float u_h;\nuniform float u_x;\nuniform float u_y;\nuniform float u_amplitude;\nuniform float u_radius;\nuniform float u_borderwidth;\nuniform float u_rotateCanvas;\nuniform float u_rotateUnit;\n\nuniform vec3 u_color_0;\nuniform vec3 u_color_1;\nuniform vec3 u_color_2;\nuniform vec3 u_color_3;\nuniform vec3 u_color_4;\nuniform vec3 u_color_5;\n\nvarying vec2 vUv;\n\nvec2 rotate(vec2 uv, float angle) {\n float x = uv.x - 0.5;\n float y = uv.y - 0.5;\n float c = cos(radians(angle));\n float s = sin(radians(angle));\n return vec2(\n x * c - y * s + 0.5,\n x * s + y * c + 0.5\n );\n}\n\nfloat box( vec2 st, vec2 pos, vec2 size ) {\n vec2 percent = (st - pos) / size;\n\tif (all(greaterThanEqual(percent, vec2(0.0))) && all(lessThanEqual(percent, vec2(1.0)))) {\n return 1.0;\n } else {\n return 0.0;\n }\n}\n\nfloat box( vec2 st, vec2 pos, vec2 size, float radius ) {\n vec2 percent = (st - pos) / size;\n \n vec2 distance = abs(percent - 0.5) - 0.5 + vec2(radius) / size;\n float edge = length(max(distance, 0.0));\n if (edge <= radius / size.x) {\n return 1.0;\n } else {\n return 0.0;\n }\n}\n\nvec3 box( vec2 st, vec2 pos, vec2 size, float radius, float borderwidth, vec4 color, float threshold ) {\n\tvec2 percent = (st - pos) / size;\n vec2 distance = abs(percent - 0.5) - 0.5 + radius / size;\n float edge = length(max(distance, 0.0));\n \n vec3 result = vec3(0.0);\n if (edge <= (radius + borderwidth) / size.x && edge >= (radius - borderwidth) / size.x) {\n return result = color.rgb * color.a + u_color_0 * ( 1.0 - color.a );\n } \n else {\n return result = vec3(u_color_0);\n }\n}\n\nvec3 pickColor(float value) {\n if( value > 0.8 ) {\n return u_color_5;\n }else if( value > 0.6 ) {\n return u_color_4;\n }else if( value > 0.4 ) {\n return u_color_3;\n }else if( value > 0.2 ) {\n return u_color_2;\n }else{\n return u_color_1;\n }\n}\n\nvoid main() {\n\n vec2 st = gl_FragCoord.xy / u_resolution;\n st = rotate( st, u_rotateCanvas );\n\n\tvec2 sst = st * u_scale;\n \n float mx = mod( sst.x, 10. ) / 10.;\n float my = mod( sst.y, 10. ) / 10.;\n\n float rand_base = sin( dot( floor( sst / 10. ), vec2( 113.1, 17.81 ))) * u_seed;\n float rand_2 = 0.5 + 0.5 * cos( rand_base ); // for color pick\n rand_2 = mod( floor(rand_2 * 100.0), 10.0 ) / 10.0;\n\n float rand_3 = 0.5 + 0.5 * sin( rand_base + rand_base ); // for filter\n float threshold = clamp( floor( rand_3 * 10.0 - 8.7 ), 0.0, 1.0 ); // filter\n\n float alpha = 0.5 + u_amplitude * cos( u_time + rand_base + 100. );\n\n\n vec3 colorpicked = pickColor(rand_2);\n vec3 finalColor = box( rotate(vec2(mx, my), u_rotateUnit ), vec2(u_x, u_y), vec2(u_w, u_h), u_radius, u_borderwidth, vec4( colorpicked, alpha ), 1. );\n\n gl_FragColor = vec4( finalColor, 1.0 );\n // gl_FragColor = vec4( vec3(rand_2), 1.0 );\n // gl_FragColor = vec4( vec3(threshold * alpha), 1.0 );\n}\n",uniforms:{u_time:{value:0},u_resolution:{value:new St(2*this.canvasH,2*this.canvasH)},u_seed:{value:this.seed},u_scale:{value:100},u_w:{value:.8},u_h:{value:.8},u_x:{value:.1},u_y:{value:.1},u_amplitude:{value:.5},u_radius:{value:.1},u_borderwidth:{value:.01},u_rotateCanvas:{value:0},u_rotateUnit:{value:0},u_color_0:{value:new kt(this.palette[0])},u_color_1:{value:new kt(this.palette[1])},u_color_2:{value:new kt(this.palette[2])},u_color_3:{value:new kt(this.palette[3])},u_color_4:{value:new kt(this.palette[4])},u_color_5:{value:new kt(this.palette[5])}}}),this.rttPlane=new dt(this.gl,{geometry:this.rttPlaneGeo,program:this.rttProgram}),this.isRenderTarget=!0}},{key:"_resetSeed",value:function(){this.rttProgram.uniforms.u_seed.value=this.seed}},{key:"_makeMaterial",value:function(){this._planeShader=new U(this.gl,{vertex:"\n attribute vec3 position;\n attribute vec2 uv;\n uniform mat4 modelViewMatrix;\n uniform mat4 projectionMatrix;\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n ",fragment:"\n precision highp float;\n uniform sampler2D tMap;\n uniform float uNoiseFactor;\n uniform float uTime;\n\n float random(vec2 co) {\n return fract(sin(dot(co.xy, vec2(12.9898, 78.233))) * 43758.5453);\n }\n\n varying vec2 vUv;\n \n void main() {\n vec4 color = texture2D(tMap, vUv);\n\n float noise = (random(vUv) - 0.5) * uNoiseFactor;\n color.rgb = color.rgb + color.rgb * noise;\n\n gl_FragColor = color;\n }\n ",uniforms:{tMap:{value:this.rtt.texture},uNoiseFactor:{value:0},uTime:{value:0}}})}},{key:"_make",value:function(){var t=new Ct(this.gl,{width:this.canvasW,height:this.canvasH});new dt(this.gl,{geometry:t,program:this._planeShader}).setParent(this.scene)}},{key:"_resetColors",value:function(){this.rttProgram.uniforms.u_color_0.value=new kt(this.palette[0]),this.rttProgram.uniforms.u_color_1.value=new kt(this.palette[1]),this.rttProgram.uniforms.u_color_2.value=new kt(this.palette[2]),this.rttProgram.uniforms.u_color_3.value=new kt(this.palette[3]),this.rttProgram.uniforms.u_color_4.value=new kt(this.palette[4]),this.rttProgram.uniforms.u_color_5.value=new kt(this.palette[5])}},{key:"_animate",value:function(){this.rttProgram.uniforms.u_time.value=this.frame/this.speed}},{key:"update",value:function(t,e){switch(t){case"scale":this.rttProgram.uniforms.u_scale.value=parseFloat(e);break;case"size":this.rttProgram.uniforms.u_size.value=[parseFloat(e),parseFloat(e)];break;case"u_w":this.rttProgram.uniforms.u_w.value=parseFloat(e),this.rttProgram.uniforms.u_x.value=(1-parseFloat(e))/2;break;case"u_h":this.rttProgram.uniforms.u_h.value=parseFloat(e),this.rttProgram.uniforms.u_y.value=(1-parseFloat(e))/2;break;case"amplitude":this.rttProgram.uniforms.u_amplitude.value=parseFloat(e);break;case"radius":this.rttProgram.uniforms.u_radius.value=parseFloat(e);break;case"borderwidth":this.rttProgram.uniforms.u_borderwidth.value=parseFloat(e);break;case"rotateCanvas":this.rttProgram.uniforms.u_rotateCanvas.value=parseFloat(e);break;case"rotateUnit":this.rttProgram.uniforms.u_rotateUnit.value=parseFloat(e);break;case"speed":var i=parseFloat(e);this.speed=-11*i+111;break;case"noise":this._planeShader.uniforms.uNoiseFactor.value=parseFloat(e)}}}])}();export{Ot as GridArrayBg}; diff --git a/src/ui/login/login-form.tsx b/src/ui/login/login-form.tsx new file mode 100644 index 0000000..63445da --- /dev/null +++ b/src/ui/login/login-form.tsx @@ -0,0 +1,286 @@ +"use client"; + +import { useState, useEffect } from "react"; +import { useToast } from "@/contexts/ToastContext"; +import * as Form from "@radix-ui/react-form"; +import useFetch from "@/hooks/useFetch"; +import GoogleLogin from "./google-login"; +import { RadioGroup, Radio } from "@headlessui/react"; +import { useRouter } from "next/navigation"; +import useUserStore from "@/store/userStore"; +import { useTranslations } from "next-intl"; +import Link from "next/link"; + +interface LoginFormProps { + toRegister: () => void; +} + +type LoginMethod = "password" | "code"; + +export default function LoginForm({ toRegister }: LoginFormProps) { + const t = useTranslations("loginForm"); + const tTerms = useTranslations("terms"); // 用于获取用户协议的标题 + const tGlobal = useTranslations(); // 用于获取全局翻译,如 "agreeTo" 和 "agreeToTerms" + const [loginMethod, setLoginMethod] = useState("password"); + const [username, setUsername] = useState(""); + const [phone, setPhone] = useState(""); + const [password, setPassword] = useState(""); + const [captcha, setCaptcha] = useState(""); + const [captchaTimer, setCaptchaTimer] = useState(0); + const [agreed, setAgreed] = useState(true); // 默认勾选 + + const router = useRouter(); + const { addToast } = useToast(); + + const setUser = useUserStore((state) => state.setUser); + + const { + fetchData: login, + loading: loginLoading, + error: loginError, + data: loginData, + } = useFetch({ + url: "/api/login/", + method: "POST", + }); + + const { + fetchData: fetchCaptcha, + loading: captchaLoading, + error: captchaError, + data: captchaData, + } = useFetch({ + url: "/api/send-verification-sms/", + method: "POST", + }); + const { + fetchData: GetUserinfo, + loading: userinfoLoading, + data: userinfoData, + } = useFetch({ + url: "/api/profile/", + method: "POST", + }); + + useEffect(() => { + let timer: NodeJS.Timeout; + if (captchaTimer > 0) { + timer = setInterval(() => { + setCaptchaTimer((prev) => prev - 1); + }, 1000); + } + return () => clearInterval(timer); + }, [captchaTimer]); + + const handleGetCaptcha = async () => { + if (!phone) { + addToast(t("enterPhoneNumber"), "error"); + return; + } + await fetchCaptcha({ phone_number: phone }); + setCaptchaTimer(60); + }; + + const handleSubmit = async (event: React.FormEvent) => { + event.preventDefault(); + + if (!agreed) { + addToast(tGlobal("agreeToTerms"), "error"); + return; + } + + // 校验非空字段 + if (loginMethod === "password" && !username) { + addToast(t("enterUsername"), "error"); + return; + } + if (loginMethod === "code" && !phone) { + addToast(t("enterPhone"), "error"); + return; + } + + if (loginMethod === "password" && !password) { + addToast(t("enterPassword"), "error"); + return; + } + + if (loginMethod === "code" && !captcha) { + addToast(t("enterCaptcha"), "error"); + return; + } + + const loginData = { + login_type: loginMethod, + ...(loginMethod === "password" && { username, password }), + ...(loginMethod === "code" && { phone, code: captcha }), + }; + + // 调用登录函数发送登录请求 + login(loginData).then(() => { + addToast(t("loginSuccess"), "success"); + + GetUserinfo().then((res) => { + console.log("userinfo", res); + setUser(res); + }); + router.replace("/create"); + }); + }; + + return ( +
+
+ +
+ + {t("orUseLoginMethod")} + +
+
+ +
+ + +
+ + + + + {t("passwordLogin")} + +
+
+ + + + + {t("codeLogin")} + +
+
+
+ + {loginMethod === "password" && ( + <> + + setUsername(e.target.value)} + className="h-10 input border-gray-600 bg-gray-800 outline-none focus:outline-none w-full rounded-lg text-sm text-gray-300 placeholder:text-gray-500" + placeholder={t("emailOrPhone")} + /> + + + + setPassword(e.target.value)} + className="h-10 input border-gray-600 bg-gray-800 outline-none focus:outline-none w-full rounded-lg text-sm text-gray-300 placeholder:text-gray-500" + placeholder={t("yourPassword")} + /> + + + )} + + {loginMethod === "code" && ( + <> + + setPhone(e.target.value)} + className="h-10 input border-gray-600 bg-gray-800 outline-none focus:outline-none w-full rounded-lg text-sm text-gray-300 placeholder:text-gray-500" + placeholder={t("phone")} + /> + + +
+ setCaptcha(e.target.value)} + className="h-10 input border-gray-600 bg-gray-800 outline-none focus:outline-none w-full rounded-lg text-sm text-gray-300 placeholder:text-gray-500" + placeholder={t("captcha")} + /> + +
+
+ + )} + + {/* 用户协议复选框 */} + +
+ +
+
+ + + {t("login")} + {loginLoading ? ( + + ) : ( + "" + )} + +
+
+ + +
+
+ ); +} diff --git a/src/ui/login/register-form.tsx b/src/ui/login/register-form.tsx new file mode 100644 index 0000000..35fb833 --- /dev/null +++ b/src/ui/login/register-form.tsx @@ -0,0 +1,301 @@ +"use client"; + +import { IoIosArrowBack } from "react-icons/io"; +import { RadioGroup, Radio } from "@headlessui/react"; +import { useState, useEffect } from "react"; +import { isValidPhoneNumber } from "@/utils/utils"; +import { useToast } from "@/contexts/ToastContext"; +import * as Form from "@radix-ui/react-form"; +import useFetch from "@/hooks/useFetch"; +import { useTranslations } from "next-intl"; +import Link from "next/link"; + +interface RegisterFormProps { + back: () => void; +} + +const plans: Plan[] = ["phone", "email"]; + +type Plan = "phone" | "email"; + +export default function RegisterForm({ back }: RegisterFormProps) { + const t = useTranslations("registerForm"); + const tTerms = useTranslations("terms"); // 用于获取用户协议的标题 + const tGlobal = useTranslations(); // 用于获取全局翻译,如 "agreeTo" 和 "agreeToTerms" + const [selected, setSelected] = useState(plans[0]); + const [email, setEmail] = useState(""); + const [phone, setPhone] = useState(""); + const [username, setUsername] = useState(""); + const [password, setPassword] = useState(""); + const [confirmPassword, setConfirmPassword] = useState(""); + const [captcha, setCaptcha] = useState(""); + const [captchaTimer, setCaptchaTimer] = useState(0); + const [agreed, setAgreed] = useState(true); // 默认勾选 + + const { addToast } = useToast(); + + // 获取验证码 + const { + fetchData: fetchVerificationCode, + data: verificationData, + loading: verificationLoading, + error: verificationError, + } = useFetch({ + url: "/api/send-verification-sms/", + method: "POST", + }); + + // 注册 + const { + fetchData: register, + data: registerData, + loading: registerLoading, + error: registerError, + } = useFetch({ + url: "/api/register/", + method: "POST", + }); + + useEffect(() => { + let timer: NodeJS.Timeout; + if (captchaTimer > 0) { + timer = setInterval(() => { + setCaptchaTimer((prev) => prev - 1); + }, 1000); + } + return () => clearInterval(timer); + }, [captchaTimer]); + + const handleGetCaptcha = async () => { + if (selected === "phone" && !isValidPhoneNumber(phone)) { + addToast(t("invalidPhoneNumber"), "error"); + return; + } + + if (selected === "email" && !email) { + addToast(t("enterEmail"), "error"); + return; + } + + const data = + selected === "phone" ? { phone_number: phone } : { email: email }; + + await fetchVerificationCode(data); + setCaptchaTimer(60); + }; + + useEffect(() => { + if (verificationData?.code === 200) { + addToast(t("captchaSent"), "success"); + setCaptchaTimer(60); + } + }, [verificationData, verificationError]); + + const handleSubmit = async (event: React.FormEvent) => { + event.preventDefault(); // 阻止表单默认提交行为 + + if (!agreed) { + addToast(tGlobal("agreeToTerms"), "error"); + return; + } + + // 校验非空字段 + if (!username || !password || !confirmPassword || !captcha) { + addToast(t("completeInformation"), "error"); + return; + } + + if (password !== confirmPassword) { + addToast(t("passwordMismatch"), "error"); + return; + } + + // 检查 email 或 phone 是否有效 + if (selected === "email" && !email) { + addToast(t("enterEmail"), "error"); + return; + } + + if (selected === "phone" && !phone) { + addToast(t("enterPhoneNumber"), "error"); + return; + } + + // 构建注册请求参数 + const registerData = { + code: captcha, + confirm_password: confirmPassword, + password, + username, + registerMethod: selected, + ...(selected === "email" && { email }), // 仅当 selected 为 "email" 时添加 email 字段 + ...(selected === "phone" && { phone }), // 仅当 selected 为 "phone" 时添加 phone 字段 + }; + + // 调用 register 函数发送注册请求 + await register(registerData); + }; + + return ( +
+
+ +
+ {t("register")} +
+
{/* 占位符,使标题居中 */} +
+ +
+ + + {plans.map((plan) => ( +
+ + + + + {t(plan)} + +
+ ))} +
+
+ + {selected === "email" && ( + + setEmail(e.target.value)} + className="h-10 input border-gray-600 bg-gray-800 focus:outline-none w-full rounded-lg text-sm text-gray-300 placeholder-gray-500" + placeholder={t("email")} + /> + + )} + {selected === "phone" && ( + + setPhone(e.target.value)} + className="h-10 input border-gray-600 bg-gray-800 focus:outline-none w-full rounded-lg text-sm text-gray-300 placeholder-gray-500" + placeholder={t("phoneNumber")} + /> + + )} + + {/* 用户名 */} + + setUsername(e.target.value)} + className="h-10 input border-gray-600 bg-gray-800 focus:outline-none w-full rounded-lg text-sm text-gray-300 placeholder-gray-500" + placeholder={t("username")} + /> + + + {/* 密码 */} + + setPassword(e.target.value)} + className="h-10 input border-gray-600 bg-gray-800 focus:outline-none w-full rounded-lg text-sm text-gray-300 placeholder-gray-500" + placeholder={t("password")} + /> + + + {/* 确认密码 */} + + setConfirmPassword(e.target.value)} + className="h-10 input border-gray-600 bg-gray-800 focus:outline-none w-full rounded-lg text-sm text-gray-300 placeholder-gray-500" + placeholder={t("confirmPassword")} + /> + + + {/* 验证码 */} + +
+ setCaptcha(e.target.value)} + className="h-10 input border-gray-600 bg-gray-800 focus:outline-none w-full rounded-lg text-sm text-gray-300 placeholder-gray-500" + placeholder={t("captcha")} + /> + +
+
+ + {/* 用户协议复选框 */} + +
+ +
+
+ + + {t("submit")} + {registerLoading ? ( + + ) : null} + +
+
+
+ ); +} diff --git a/src/ui/page/page-Teach.tsx b/src/ui/page/page-Teach.tsx new file mode 100644 index 0000000..9e02936 --- /dev/null +++ b/src/ui/page/page-Teach.tsx @@ -0,0 +1,303 @@ +import Image from "next/image"; +import IconHowItWorks from "/public/icons/IconHowItWorks.svg"; +export default function PageTeach() { + return ( +
+
+
+
+ typeframes.ai logo + How it works +
+
+

+ Creating TikTok content has never been that easy +

+
+
+
+
+
+ + 1 + + + 1 + +
+

+ Find what goes viral +

+

+ AI will find the best content for you that you can + easily repurpose into TikTok videos. +

+
    +
  • +
    + typeframes.ai logo +
    + Search with complex queries +
  • +
  • +
    + typeframes.ai logo +
    + + Get full video transcript to fuel your next + script + +
  • +
  • +
    + typeframes.ai logo +
    + Use advanced search +
  • +
+
+
+
+ {/* from text to video in typeframes.ai */} +
+
+
+
+
+
+
+
+ + 2 + + + 1 + +
+

+ Generate scripts in seconds +

+

+ Our AI understands what makes videos go viral and + use the same proven methods to write scripts for + you. +

+
    +
  • +
    + typeframes.ai logo +
    + Ask it what you want to talk about +
  • +
  • +
    + typeframes.ai logo +
    + + The AI will find relevant content to get + inspired by + +
  • +
  • +
    + typeframes.ai logo +
    + + Drop any link and it will be automatically + parsed and formatted for a video + +
  • +
+
+
+
+ {/* from text to video in typeframes.ai */} +
+
+
+
+
+
+
+
+ + 3 + + + 1 + +
+

+ Viral-First Video Creation +

+

+ Create perfect videos for social media, grab + attention, and grow your business. +

+
    +
  • +
    + typeframes.ai logo +
    + + Create vertical videos from any content, + ready to be published + +
  • +
  • +
    + typeframes.ai logo +
    + + Generate voice, add animations and create + super engaging content + +
  • +
  • +
    + typeframes.ai logo +
    + + Create automations, typeframes.ai will watch + your blog, a subreddit, Twitter or Linkedin + account and create content automatically + +
  • +
+
+
+
+ {/* from text to video in typeframes.ai */} +
+
+
+
+
+ {/* typeframes.ai logo */} +

+ Your shortcut to effortless video story telling. +

+ +
+
+ ); +} diff --git a/src/ui/page/page-expect.tsx b/src/ui/page/page-expect.tsx new file mode 100644 index 0000000..305510c --- /dev/null +++ b/src/ui/page/page-expect.tsx @@ -0,0 +1,119 @@ +import { useTranslations } from "next-intl"; + +export default function PageExpect() { + const t = useTranslations("pageExpect"); + return ( +
+
+
+
+
+
+ {/* */} + {t("whatToExpect")} +
+
+

+ {t("heading")} +

+

+ {t("description")} +

+
+
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+
+ {/* easy to use */} +
+
+
+ {t("easyToUse.title")} +
+

+ {t("easyToUse.description")} +

+
+
+
+
+ {/* customisable templates */} +
+
+
+ {t("customisableTemplates.title")} +
+

+ {t("customisableTemplates.description")} +

+
+
+
+
+ {/* high quality exports */} +
+
+
+ {t("highQualityExports.title")} +
+

+ {t("highQualityExports.description")} +

+
+
+
+
+
+ {/* typeframes.ai logo */} +

+ {t("aiPowered")} +

+ +
+
+
+ ); +} diff --git a/src/ui/page/page-faqs.tsx b/src/ui/page/page-faqs.tsx new file mode 100644 index 0000000..9014d0f --- /dev/null +++ b/src/ui/page/page-faqs.tsx @@ -0,0 +1,449 @@ +export default function PageFaqs() { + return ( +
+
+
+
+
+
+
+
+
+
+
+
+
+
+ + + + + + FAQs +
+
+

+ Frequently Asked Questions +

+
+
+
+
+
+ How can typeframes.ai transform my content + creation game? +
+
+ + + + + + +
+
+
+
+ typeframes.ai is your secret weapon for + creating irresistible vertical videos in a + snap. Our AI-powered platform analyzes + millions of viral videos to craft scripts + and generate stunning visuals that are + optimized for maximum impact. Whether you're + creating product demos, explainer videos, or + social media ads, typeframes.ai helps you + produce content that consistently captivates + your audience. +
+
+
+
+
+
+ I'm not a video editing pro. Can I still use + typeframes.ai? +
+
+ + + + + + +
+
+
+
+ Absolutely! typeframes.ai is designed with + creators like you in mind. Our intuitive + interface and AI-driven tools make it a + breeze to produce professional-grade videos, + even if you've never edited before. Simply + input your text or link, and let our AI work + its magic. It's like having a video editing + genius at your fingertips! +
+
+
+
+
+
+ What kind of content can I create with + typeframes.ai? +
+
+ + + + + + +
+
+
+
+ The possibilities are endless! Whether you + want to repurpose a blog post, turn a + podcast into a video, create a viral TikTok + from scratch, or produce engaging product + demos and explainer videos, typeframes.ai + has you covered. Our AI can generate scripts + from any text or URL, find the perfect viral + hooks, and even create videos automatically + from your favorite content sources. If you + can dream it, typeframes.ai can help you + create it. +
+
+
+
+
+
+ How much control do I have over the + AI-generated content? +
+
+ + + + + + +
+
+
+
+ While our AI is incredibly powerful, you + always remain in the driver's seat. + typeframes.ai provides a foundation of + high-quality, engaging content that you can + then customize to your heart's content. From + adding a professional sounding voice-over + and branding elements to fine-tuning the + visuals and pacing, our platform empowers + you to create videos that are authentically + yours. +
+
+
+
+
+
+ How can typeframes.ai help me grow my + audience and business? +
+
+ + + + + + +
+
+
+
+ typeframes.ai is your partner in audience + growth and business success. Our AI is + trained on millions of viral videos, so it + knows exactly what makes content + irresistible. From attention-grabbing hooks + to mesmerizing visuals, typeframes.ai helps + you create videos that demand to be watched + and shared. Our users have reported an + average of 600% increase in video + engagement, 200% monthly growth in their + businesses, and a staggering 10,000+ videos + created in just 8 minutes each. Rest + assured, your content creation success is + our #1 incentive. +
+
+
+
+
+
+ Is my data safe with typeframes.ai? +
+
+ + + + + + +
+
+
+
+ Absolutely. We take data privacy and + security very seriously. typeframes.ai + employs industry-standard encryption and + security measures to protect your content + and personal information. We never share + your data with third parties without your + explicit consent. With typeframes.ai, you + can focus on creating amazing videos while + we take care of keeping your data safe and + sound. +
+
+
+
+
+
+ How much time and effort can typeframes.ai + save me? +
+
+ + + + + + +
+
+
+
+ typeframes.ai is like having a full video + production team at your beck and call, 24/7. + Our AI handles the heavy lifting, from + researching viral trends to generating + scripts and visuals. What used to take hours + or even days can now be accomplished in + minutes. And with our Automations feature, + you can even set typeframes.ai to create + videos for you on autopilot. It's the + ultimate time-saver for busy creators who + don't want to compromise on quality! +
+
+
+
+
+
+ How does typeframes.ai stay ahead of the + curve in video creation? +
+
+ + + + + + +
+
+
+
+ Our team of video experts and AI engineers + are constantly pushing the boundaries of + what's possible. We stay on top of the + latest trends, platform updates, and best + practices to ensure that typeframes.ai + remains the cutting-edge tool for creating + irresistible videos. As the digital + landscape evolves, so does typeframes.ai, + giving you a competitive edge in your + content creation game. +
+
+
+
+
+
+ What if I need help or have questions? +
+
+ + + + + + +
+
+
+
+ We're here for you every step of the way! + Our friendly support team, made up of video + experts and creators like you, is always + ready to answer your questions, provide + guidance, and help you get the most out of + typeframes.ai. We're not just a software + company – we're a community of passionate + creators dedicated to helping you succeed. + Consider us your personal video creation + cheerleaders! +
+
+
+
+
+
+ Can I try typeframes.ai for free? +
+
+ + + + + + +
+
+
+
+
+ While theres no free version of + typeframes.ai, we do offer a suite of{" "} + + AI-powered mini-tools + {" "} + that you can take for a spin.Get a taste + of the magic by creating clips from + YouTube videos, generating AI avatar + videos, and more. And when youre ready + to unleash the full power of + typeframes.ai, our flexible pricing + plans make it easy to find the perfect + fit for your needs and budget. Trust us, + once you experience the typeframes.ai + difference, youll wonder how you ever + created content without it! +
+
+
+
+
+
+
+
+ ); +} diff --git a/src/ui/page/page-footer.tsx b/src/ui/page/page-footer.tsx new file mode 100644 index 0000000..f1bec7a --- /dev/null +++ b/src/ui/page/page-footer.tsx @@ -0,0 +1,37 @@ +import { useTranslations } from "next-intl"; +export default function PageFooter() { + const t = useTranslations("pageFooter"); + return ( + + ); +} diff --git a/src/ui/page/page-header.tsx b/src/ui/page/page-header.tsx new file mode 100644 index 0000000..b94b857 --- /dev/null +++ b/src/ui/page/page-header.tsx @@ -0,0 +1,64 @@ +import Image from "next/image"; +import { useTranslations } from "next-intl"; + +import logoImage from "/public/images/logo.png"; +import Link from "next/link"; +export default function PageHeader() { + const t = useTranslations("pageHeader"); + return ( +
+
+ + typeframes.ai logo + + +
+
+ ); +} diff --git a/src/ui/page/page-intro.tsx b/src/ui/page/page-intro.tsx new file mode 100644 index 0000000..fd5468e --- /dev/null +++ b/src/ui/page/page-intro.tsx @@ -0,0 +1,74 @@ +import { useTranslations } from "next-intl"; +import Image from "next/image"; +import starsImage from "/public/images/stars.avif"; + +export default function PageIntro() { + const t = useTranslations("pageIntro"); + + return ( +
+
+
+

+ {t("heading")}{" "} + + {t("highlightedText")} + +

+

+ {t("description.line1")} +
+ {t("description.line2")} +
+ {t("description.line3")} +

+ +
+
+ ratings +
+
+
+
+ {t("ratings")} +
+
+
+
+
+
+
+
+
+
+ +
+
+

+ {t("madeWithLove")} +

+
+
+
+ ); +} diff --git a/src/ui/page/page-remark.tsx b/src/ui/page/page-remark.tsx new file mode 100644 index 0000000..efb9f61 --- /dev/null +++ b/src/ui/page/page-remark.tsx @@ -0,0 +1,110 @@ +import { useTranslations } from "next-intl"; + +export default function PageRemark() { + const t = useTranslations("pageRemark"); + return ( +
+
+
+
+
+
+ {/* easy to use */} +
+
+
+
+
+ {/* easy to use */} +
+
+
+
+
+
+
+ {/* easy to use */} +
+
+
+
+
+ {/* easy to use */} +
+
+
+
+
+
+
+ {/* easy to use */} +
+
+
+
+
+ {/* easy to use */} +
+
+
+
+
+

+ {t("heading")} +

+

+ {t("description")} +

+ +
+
+
+
+
+
+ {/* easy to use */} +
+
+
+
+
+ {/* easy to use */} +
+
+
+
+
+
+
+ {/* easy to use */} +
+
+
+
+
+ {/* easy to use */} +
+
+
+
+
+
+
+ {/* easy to use */} +
+
+
+
+
+ {/* easy to use */} +
+
+
+
+
+ ); +} diff --git a/src/ui/page/page-statis.tsx b/src/ui/page/page-statis.tsx new file mode 100644 index 0000000..e1498aa --- /dev/null +++ b/src/ui/page/page-statis.tsx @@ -0,0 +1,44 @@ +import { useTranslations } from "next-intl"; +export default function PageStatis() { + const t = useTranslations("pageStatis"); + + return ( +
+
+
+
+

+ {t("creatorsUsing.number")} +

+

+ {t("creatorsUsing.description")} +

+
+
+

+ {t("videoEngagement.percentage")} +

+

+ {t("videoEngagement.description")} +

+
+
+

+ {t("videosMade.number")} +

+

+ {t("videosMade.description")} +

+
+
+

+ {t("monthlyGrowth.percentage")} +

+

+ {t("monthlyGrowth.description")} +

+
+
+
+ ); +} diff --git a/src/ui/page/page-tools.tsx b/src/ui/page/page-tools.tsx new file mode 100644 index 0000000..8d735a0 --- /dev/null +++ b/src/ui/page/page-tools.tsx @@ -0,0 +1,368 @@ +export default function PageTools() { + return ( +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* */} + Tools +
+
+

+ Easily create TikTok videos with pre-made tools +

+

+ Pick the right tool, provides your input, and youll + create a video in no time - customize it however you + want. +

+
+
+
+
+
+
+ {/* youtube */} +
+

+ Create clips from YouTube +

+

+ Convert your YouTube video into a short + vertical +

+ + Try it out + + + + + +
+
+
+
+
+ {/* tiktok */} +
+

+ Create TikTok videos +

+

Convert your text into a TikTok video

+ + Try it out + + + + + +
+
+
+
+
+ + + +
+

+ Create An AI avatar Video +

+

+ Generate a vertical video with a talking + avatar +

+ + Try it out + + + + + +
+
+
+
+
+ + + +
+

+ Turn Audio into Video +

+

+ Make engaging videos from your podcasts, + interviews, or any audio content +

+ + Try it out + + + + + +
+
+
+
+
+ + + +
+

+ Turn a Reddit post into a Video +

+

+ Make engaging videos from your podcasts, + interviews, or any audio content +

+ + Try it out + + + + + +
+
+
+
+
+ {/* twitter/x */} +
+

+ Tweet/X to Video +

+

Convert your tweets to video

+ + Try it out + + + + + +
+
+
+
+ + See all tools + + + + + +
+
+
+ ); +} diff --git a/src/utils/request.ts b/src/utils/request.ts new file mode 100644 index 0000000..12fdbae --- /dev/null +++ b/src/utils/request.ts @@ -0,0 +1,138 @@ +import { redirect } from 'next/navigation'; // 如果在 SSR 中需要使用 + +import queryString from 'query-string'; +type Method = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH'; + +interface Params { + cacheTime?: number; //缓存时间,单位为s。默认强缓存,0为不缓存 + params?: Record; +} + +interface Props extends Params { + url: string; + method: Method; +} + +type Config = { next: { revalidate: number } } | { cache: 'no-store' } | { cache: 'force-cache' }; + +class Request { + /** + * 请求拦截器 + */ + interceptorsRequest({ url, method, params, cacheTime }: Props) { + let queryParams = ''; //url参数 + let requestPayload = ''; //请求体数据 + //请求头 + const headers = { + authorization: `Bearer ...`, + }; + + const config: Config = + cacheTime || cacheTime === 0 + ? cacheTime > 0 + ? { next: { revalidate: cacheTime } } + : { cache: 'no-store' } + : { cache: 'force-cache' }; + + if (method === 'GET' || method === 'DELETE') { + //fetch对GET请求等,不支持将参数传在body上,只能拼接url + if (params) { + queryParams = queryString.stringify(params); + url = `${url}?${queryParams}`; + } + } else { + //非form-data传输JSON数据格式 + if (!['[object FormData]', '[object URLSearchParams]'].includes(Object.prototype.toString.call(params))) { + Object.assign(headers, { 'Content-Type': 'application/json' }); + requestPayload = JSON.stringify(params); + } + } + return { + url, + options: { + method, + headers, + body: method !== 'GET' && method !== 'DELETE' ? requestPayload : undefined, + ...config, + }, + }; + } + + /** + * 响应拦截器 + */ + interceptorsResponse(res: Response): Promise { + return new Promise((resolve, reject) => { + const requestUrl = res.url; + if (res.ok) { + res + .clone() + .text() + .then((text) => { + try { + const data = JSON.parse(text); + console.log("resp code:", data.code) + if (data.code == 200) { + return resolve(res.json() as Promise); + } else { + return reject({ code: data.code, message: data.message, url: requestUrl }); + } + } catch (err) { + return reject({ message: text, url: requestUrl }); + } + }); + } else { + res + .clone() + .text() + .then((text) => { + try { + const errorData = JSON.parse(text); + return reject({ code: res.status, message: errorData || '接口错误', url: requestUrl }); + } catch { + return reject({ code: res.status, message: text, url: requestUrl }); + } + }); + } + }); + } + + async httpFactory({ url = '', params = {}, method }: Props): Promise { + const req = this.interceptorsRequest({ + url: process.env.NEXT_PUBLIC_BASEURL + url, + method, + params: params.params, + cacheTime: params.cacheTime, + }); + const res = await fetch(req.url, req.options); + return this.interceptorsResponse(res); + } + + async request(method: Method, url: string, params?: Params): Promise { + return this.httpFactory({ url, params, method }); + } + + get(url: string, params?: Params): Promise { + return this.request('GET', url, params); + } + + post(url: string, params?: Params): Promise { + return this.request('POST', url, params); + } + + put(url: string, params?: Params): Promise { + return this.request('PUT', url, params); + } + + delete(url: string, params?: Params): Promise { + return this.request('DELETE', url, params); + } + + patch(url: string, params?: Params): Promise { + return this.request('PATCH', url, params); + } +} + +const request = new Request(); + +export default request; \ No newline at end of file diff --git a/src/utils/utils.ts b/src/utils/utils.ts new file mode 100644 index 0000000..1f4ca9a --- /dev/null +++ b/src/utils/utils.ts @@ -0,0 +1,10 @@ +/** + * 校验手机号码的函数 + * @param phoneNumber - 要校验的手机号码 + * @returns 如果手机号码有效则返回 true,否则返回 false + */ +export function isValidPhoneNumber(phoneNumber: string): boolean { + // 正则表达式,用于匹配有效的手机号码(中国大陆的手机号码格式) + const phoneNumberRegex = /^1[3-9]\d{9}$/; + return phoneNumberRegex.test(phoneNumber); +} diff --git a/tailwind.config.ts b/tailwind.config.ts new file mode 100644 index 0000000..eba1e46 --- /dev/null +++ b/tailwind.config.ts @@ -0,0 +1,81 @@ +import type { Config } from "tailwindcss"; +import daisyui from "daisyui" + +const config: Config = { + content: [ + "./src/pages/**/*.{js,ts,jsx,tsx,mdx}", + "./src/components/**/*.{js,ts,jsx,tsx,mdx}", + "./src/app/**/*.{js,ts,jsx,tsx,mdx}", + "./src/ui/**/*.{js,ts,jsx,tsx,mdx}", + "./src/contexts/**/*.{js,ts,jsx,tsx,mdx}", + ], + theme: { + extend: { + backgroundImage: { + "gradient-radial": "radial-gradient(var(--tw-gradient-stops))", + "gradient-conic": + "conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))", + }, + colors: { + + }, + keyframes: { + 'accordion-up': { + '0%': { height: 'var(--radix-collapsible-content-height)', opacity: "1" }, + '100%': { height: '0', opacity: "0" }, + }, + 'accordion-down': { + '0%': { height: '0', opacity: "0" }, + '100%': { height: 'var(--radix-collapsible-content-height)', opacity: "" }, + }, + }, + animation: { + 'accordion-up': 'accordion-up 0.3s ease-out', + 'accordion-down': 'accordion-down 0.3s ease-out', + }, + }, + }, + plugins: [ + daisyui, + require('@tailwindcss/forms'), + ], + daisyui: { + themes: [ + { + typeframes: { + // 定义主要颜色和相关变量 + "primary": "hsl(210.34, 92.708%, 62.353%)", // 对应 --p + "--pf": "210.34, 92.708%, 49.882%", // 对应 --pf + "secondary": "hsl(141.89, 69.159%, 58.039%)", // 对应 --s + "--sf": "141.89, 69.159%, 46.431%", // 对应 --sf + "accent": "hsl(0, 0%, 0%)", // 对应 --af + "neutral": "hsl(0, 0%, 13.333%)", // 对应 --n + "base-100": "hsl(0, 0%, 96.471%)", // 对应 --b1 + "base-200": "hsl(210, 5.5556%, 92.941%)", // 对应 --b2 + "base-300": "hsl(210, 5.5556%, 83.647%)", // 对应 --b3 + "info": "hsl(208.57, 9.7674%, 57.843%)", // 对应 --in + "success": "hsl(142.09, 70.563%, 45.294%)", // 对应 --su + "warning": "hsl(43, 96%, 56%)", // 对应 --wa + "error": "hsl(0, 90.541%, 70.98%)", // 对应 --er + + // 边框和圆角相关变量 + "--rounded-box": "1rem", // 对应 --rounded-box + "--rounded-btn": "0.5rem", // 对应 --rounded-btn + "--rounded-badge": "1.9rem", // 对应 --rounded-badge + "--border-btn": "1px", // 对应 --border-btn + "--tab-border": "1px", // 对应 --tab-border + "--tab-radius": "0.5rem", // 对应 --tab-radius + + // 动画相关变量 + "--animation-btn": "0.25s", // 对应 --animation-btn + "--animation-input": "0.2s", // 对应 --animation-input + + // 文本和焦点样式 + "--btn-text-case": "uppercase", // 对应 --btn-text-case + "--btn-focus-scale": "0.95", // 对应 --btn-focus-scale + }, + }, + ], + }, +}; +export default config; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..541754f --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,33 @@ +{ + "compilerOptions": { + "noImplicitAny": false, + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./src/*"] + } + }, + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts", + "src/ui/page/page-remark" + ], + "exclude": ["node_modules"] +}