diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index f16a820e12ecace1d740174f027945ed7ec8fc68..0000000000000000000000000000000000000000 --- a/.eslintignore +++ /dev/null @@ -1,8 +0,0 @@ -public -tailwind.config.js -react-draft-wysiwyg -cypress.config.ts -src/pages/api/__coverage__.js -next.config.js -src/declarations/app/* -.dfx/* \ No newline at end of file diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index 6ee48ad2569f8a676b096c13a51b349ef09bb0ce..0000000000000000000000000000000000000000 --- a/.eslintrc +++ /dev/null @@ -1,53 +0,0 @@ -{ - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": 2018, - "sourceType": "module", - "project": ["./tsconfig.json"] - }, - "plugins": [ - "@next/eslint-plugin-next", - "@typescript-eslint", - "react-hooks", - "import", - "simple-import-sort", - "import-newlines" - ], - "extends": [ - "airbnb-typescript", - "plugin:@typescript-eslint/recommended", - "plugin:prettier/recommended" - ], - "rules": { - "@typescript-eslint/no-explicit-any": "error", - "no-unused-vars": "error", - "react/jsx-filename-extension": [0], - "implicit-arrow-linebreak": "off", - "react-hooks/rules-of-hooks": "error", - "react-hooks/exhaustive-deps": "error", - "no-param-reassign": [ - "error", - { - "props": true - } - ], - "no-console": ["error", { "allow": ["warn", "error"] }], - "@typescript-eslint/comma-dangle": "off", - "function-paren-newline": "off", - "quotes": ["error", "single", { - "avoidEscape": true, - "allowTemplateLiterals": true - }], - "jsx-quotes": ["error", "prefer-single"] - }, - "settings": { - "import/extensions": [".js", ".ts", ".tsx"], - "import/parsers": { - "@typescript-eslint/parser": [".ts", ".tsx"] - }, - "react": { - "pragma": "React", - "version": "detect" - } - } -} diff --git a/.gitignore b/.gitignore index 30204822515140e470b4d6fcbd3d8da774c6c628..712ad9d0dcbc554bb70cb74dfa7218bbd7e502b4 100644 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,14 @@ next-env.d.ts # Ignore Jetbrains IDE folder .idea/* + +# Ignore emacs temporary files +*~ +*# + +# Vite files +dist/ + +# Bun +bun.lockb + diff --git a/@types/quill-mention.d.ts b/@types/quill-mention.d.ts deleted file mode 100644 index f806110eea36c342f924187b105f4190d6f7d0d7..0000000000000000000000000000000000000000 --- a/@types/quill-mention.d.ts +++ /dev/null @@ -1 +0,0 @@ -declare module 'quill-mention'; diff --git a/README.md b/README.md index 6a552e2026f1cb6fb991c215b59bab71ab432f0b..40d1313846b619e0e035f3a436b3eeecc40ef9d6 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,22 @@ -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). +Haven is a vite app. ## Getting Started First, run the development server: ```bash +npm install npm run dev # or +yarn install yarn dev +# or +bun install +bun run dev ``` Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. -You can start editing the page by modifying `pages/index.tsx`. The page auto-updates as you edit the file. - -[API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.ts`. - -The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages. - ## ICP Cannister HOWTO https://internetcomputer.org/docs/current/developer-docs/web-apps/application-frontends/existing-frontend @@ -44,17 +43,15 @@ Deploy dfx deploy --network ic --identity icp_prod ``` -## 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! +# Production -## 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. +``` +npm run build +npm run preview +# or +yarn build +yarn preview +# or +bun run build +bun run preview +``` diff --git a/dfx.json b/dfx.json index e5a3fa096f9429415be30bcf6b6f06817d5c58d4..fb7e1edcfdfcf28654cedec198165c995216bd8d 100644 --- a/dfx.json +++ b/dfx.json @@ -2,9 +2,9 @@ "canisters": { "app": { "frontend": { - "entrypoint": "out/index.html" + "entrypoint": "dist/index.html" }, - "source": ["out"], + "source": ["dist"], "type": "assets" } }, diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000000000000000000000000000000000000..98ccffb55a677bb1113e2beb55739de7ff75ea85 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,54 @@ +import typescriptPlugin from '@typescript-eslint/eslint-plugin'; +import typescriptParser from '@typescript-eslint/parser'; +import reactPlugin from 'eslint-plugin-react'; +import reactHooksPlugin from 'eslint-plugin-react-hooks'; + +export default [{ + files: ['src/**/*.{js,jsx,ts,tsx}'], + ignores: [ + 'node_modules/**', + 'dist/**', + 'build/**', + 'coverage/**', + '.vite/**', + '*.config.js', + '*.config.ts', + 'public/**', + 'tailwind.config.js', + 'react-draft-wysiwyg/**', + 'cypress.config.ts', + 'src/pages/api/__coverage__.js', + 'next.config.js', + 'src/declarations/app/**', + '.dfx/**' + ], + languageOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + parser: typescriptParser, + parserOptions: { + ecmaFeatures: { + jsx: true + } + }, + globals: { + document: 'readonly', + navigator: 'readonly', + window: 'readonly' + } + }, + plugins: { + '@typescript-eslint': typescriptPlugin, + 'react': reactPlugin, + 'react-hooks': reactHooksPlugin + }, + settings: { + react: { + version: 'detect' + } + }, + rules: { + 'react/react-in-jsx-scope': 'off', + 'react/prop-types': 'off' + } +}]; \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000000000000000000000000000000000000..c93c66a22c1658f7dc7e1937d37c7d23b62d977e --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <meta charset="UTF-8" /> + <link rel="icon" type="image/svg+xml" href="/favicon.ico" /> + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> + <title>Haven Web</title> + </head> + <body> + <div id="root"></div> + <script type="module" src="/src/main.tsx"></script> + </body> +</html> \ No newline at end of file diff --git a/next.config.js b/next.config.js deleted file mode 100644 index e8b59385beb295bb6e9a83d0dda1b5f7f145c72d..0000000000000000000000000000000000000000 --- a/next.config.js +++ /dev/null @@ -1,11 +0,0 @@ -const nextBuildId = require('next-build-id'); -const withBundleAnalyzer = require('@next/bundle-analyzer')({ - enabled: process.env.ANALYZE === 'true' -}) -const nextConfig = { - output: 'export', - reactStrictMode: false, - generateBuildId: () => nextBuildId({ dir: __dirname }) -}; - -module.exports = withBundleAnalyzer(nextConfig); diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index b8d65673c4a0a4c45c18d8d462bac3db87158dde..0000000000000000000000000000000000000000 --- a/package-lock.json +++ /dev/null @@ -1,17036 +0,0 @@ -{ - "name": "haven-web", - "version": "0.3.22", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "haven-web", - "version": "0.3.22", - "dependencies": { - "@emoji-mart/data": "^1.2.1", - "@emoji-mart/react": "^1.1.1", - "@fortawesome/fontawesome-svg-core": "^6.4.0", - "@fortawesome/free-brands-svg-icons": "^6.4.0", - "@fortawesome/free-solid-svg-icons": "^6.4.0", - "@fortawesome/react-fontawesome": "^0.2.0", - "@juggle/resize-observer": "^3.4.0", - "@react-oauth/google": "^0.9.0", - "@react-spring/web": "^9.5.5", - "@reduxjs/toolkit": "^1.9.1", - "body-scroll-lock": "^4.0.0-beta.0", - "classnames": "^2.3.1", - "contrast-color": "^1.0.1", - "copy-to-clipboard": "^3.3.2", - "dayjs": "^1.11.9", - "delay": "^5.0.0", - "dexie": "^3.2.2", - "dompurify": "^2.4.0", - "dropbox": "^10.34.0", - "emoji-mart": "^5.6.0", - "file-saver": "^2.0.5", - "fuse.js": "^6.6.2", - "html-to-text": "^9.0.4", - "i18next": "^22.4.11", - "i18next-browser-languagedetector": "^7.0.1", - "js-cookie": "^3.0.1", - "lodash": "^4.17.21", - "lucide-react": "^0.453.0", - "next": "^14.2.16", - "next-seo": "^5.11.1", - "parchment": "^2.0.1", - "quill": "^1.3.7", - "quill-auto-detect-url": "^0.2.1", - "quill-mention": "^3.1.0", - "react": "18.3.1", - "react-dom": "18.3.1", - "react-error-boundary": "^3.1.4", - "react-hot-toast": "^2.4.1", - "react-i18next": "^12.2.0", - "react-moment": "^1.1.2", - "react-multiline-clamp": "^2.0.0", - "react-quill": "^2.0.0", - "react-redux": "^8.0.5", - "react-spring": "^9.5.2", - "react-tailwindcss-select": "^1.6.0", - "react-tooltip": "^5.7.4", - "react-use-measure": "^2.1.1", - "redux": "^4.2.0", - "redux-localstorage": "^0.4.1", - "serve": "^14.2.4", - "ts.data.json": "^2.2.0", - "use-sound": "^4.0.1", - "usehooks-ts": "^2.9.1", - "uuid": "^9.0.0", - "xxdk-wasm": "^0.3.21" - }, - "devDependencies": { - "@cypress/code-coverage": "^3.13.4", - "@cypress/webpack-preprocessor": "^6.0.2", - "@next/bundle-analyzer": "^15.0.2", - "@testing-library/cypress": "^10.0.2", - "@types/contrast-color": "^1.0.0", - "@types/dompurify": "^2.3.4", - "@types/draftjs-to-html": "^0.8.1", - "@types/emoji-mart": "^3.0.14", - "@types/file-saver": "^2.0.5", - "@types/html-to-text": "^9.0.0", - "@types/js-cookie": "^3.0.2", - "@types/lodash": "^4.14.185", - "@types/node": "18.7.14", - "@types/react": "18.3.11", - "@types/react-dom": "18.3.0", - "@types/react-draft-wysiwyg": "^1.13.4", - "@types/testing-library__cypress": "^5.0.9", - "@types/uuid": "^8.3.4", - "@typescript-eslint/eslint-plugin": "^5.45.0", - "autoprefixer": "^10.4.20", - "babel-plugin-istanbul": "^6.1.1", - "cypress": "^13.15.1", - "eslint": "8.23.0", - "eslint-config-airbnb-typescript": "^17.0.0", - "eslint-config-next": "^13.0.6", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-import-newlines": "^1.3.0", - "eslint-plugin-prettier": "^5.2.1", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-simple-import-sort": "^8.0.0", - "eslint-plugin-sort-destructure-keys": "^1.4.0", - "next-build-id": "^3.0.0", - "nyc": "^15.1.0", - "postcss": "^8.4.47", - "prettier": "^3.3.3", - "prettier-plugin-tailwindcss": "^0.4.1", - "sass": "^1.80.5", - "tailwindcss": "^3.4.14", - "typed-scss-modules": "^8.0.1", - "typescript": "4.8.2" - } - }, - "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/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz", - "integrity": "sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", - "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.0", - "@babel/generator": "^7.26.0", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.0", - "@babel/parser": "^7.26.0", - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.26.0", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz", - "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==", - "dependencies": { - "@babel/parser": "^7.26.2", - "@babel/types": "^7.26.0", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", - "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", - "peer": true, - "dependencies": { - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.9.tgz", - "integrity": "sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==", - "peer": true, - "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", - "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", - "dependencies": { - "@babel/compat-data": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", - "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", - "peer": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/traverse": "^7.25.9", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.9.tgz", - "integrity": "sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==", - "peer": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "regexpu-core": "^6.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", - "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", - "peer": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", - "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", - "peer": true, - "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", - "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", - "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", - "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", - "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", - "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", - "peer": true, - "dependencies": { - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", - "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", - "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", - "peer": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-wrap-function": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz", - "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", - "peer": true, - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz", - "integrity": "sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==", - "peer": true, - "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", - "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", - "peer": true, - "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", - "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", - "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", - "peer": true, - "dependencies": { - "@babel/template": "^7.25.9", - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", - "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", - "dependencies": { - "@babel/template": "^7.25.9", - "@babel/types": "^7.26.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz", - "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", - "dependencies": { - "@babel/types": "^7.26.0" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", - "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", - "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", - "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", - "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/plugin-transform-optional-chaining": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" - } - }, - "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", - "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", - "peer": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-export-default-from": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.25.9.tgz", - "integrity": "sha512-ykqgwNfSnNOB+C8fV5X4mG3AVmvu+WVxcaU9xHHtBb7PCrPeweMmPjGsn8eMaeJg6SJuoUuZENeeSWaarWqonQ==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", - "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0-placeholder-for-preset-env.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", - "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", - "peer": true, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-export-default-from": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.25.9.tgz", - "integrity": "sha512-9MhJ/SMTsVqsd69GyQg89lYR4o9T+oDGv5F6IsigxxqFVOyR/IflDLYP8WDI1l8fkhNGGktqkvL5qwNCtGEpgQ==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-flow": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.26.0.tgz", - "integrity": "sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", - "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", - "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", - "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", - "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-unicode-sets-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", - "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", - "peer": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", - "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz", - "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-remap-async-to-generator": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", - "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", - "peer": true, - "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-remap-async-to-generator": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz", - "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", - "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", - "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", - "peer": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", - "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", - "peer": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", - "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", - "peer": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9", - "@babel/traverse": "^7.25.9", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", - "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/template": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", - "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", - "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", - "peer": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", - "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", - "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", - "peer": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", - "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.9.tgz", - "integrity": "sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==", - "peer": true, - "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", - "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.9.tgz", - "integrity": "sha512-/VVukELzPDdci7UUsWQaSkhgnjIWXnIyRpM02ldxaVoFK96c41So8JcKT3m0gYjyv7j5FNPGS5vfELrWalkbDA==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-syntax-flow": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", - "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", - "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", - "peer": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", - "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", - "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", - "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", - "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", - "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", - "peer": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz", - "integrity": "sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==", - "peer": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-simple-access": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", - "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", - "peer": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", - "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", - "peer": true, - "dependencies": { - "@babel/helper-module-transforms": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", - "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", - "peer": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", - "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz", - "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", - "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", - "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", - "peer": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-transform-parameters": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", - "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-replace-supers": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", - "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", - "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", - "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", - "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", - "peer": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", - "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", - "peer": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", - "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz", - "integrity": "sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz", - "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==", - "peer": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-syntax-jsx": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", - "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz", - "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", - "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "regenerator-transform": "^0.15.2" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-regexp-modifiers": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", - "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", - "peer": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", - "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-runtime": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz", - "integrity": "sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ==", - "peer": true, - "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.6", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", - "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-spread": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", - "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", - "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz", - "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz", - "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.9.tgz", - "integrity": "sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ==", - "peer": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/plugin-syntax-typescript": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", - "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", - "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", - "peer": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", - "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", - "peer": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", - "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", - "peer": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/preset-env": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.0.tgz", - "integrity": "sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==", - "peer": true, - "dependencies": { - "@babel/compat-data": "^7.26.0", - "@babel/helper-compilation-targets": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", - "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.26.0", - "@babel/plugin-syntax-import-attributes": "^7.26.0", - "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.25.9", - "@babel/plugin-transform-async-generator-functions": "^7.25.9", - "@babel/plugin-transform-async-to-generator": "^7.25.9", - "@babel/plugin-transform-block-scoped-functions": "^7.25.9", - "@babel/plugin-transform-block-scoping": "^7.25.9", - "@babel/plugin-transform-class-properties": "^7.25.9", - "@babel/plugin-transform-class-static-block": "^7.26.0", - "@babel/plugin-transform-classes": "^7.25.9", - "@babel/plugin-transform-computed-properties": "^7.25.9", - "@babel/plugin-transform-destructuring": "^7.25.9", - "@babel/plugin-transform-dotall-regex": "^7.25.9", - "@babel/plugin-transform-duplicate-keys": "^7.25.9", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", - "@babel/plugin-transform-dynamic-import": "^7.25.9", - "@babel/plugin-transform-exponentiation-operator": "^7.25.9", - "@babel/plugin-transform-export-namespace-from": "^7.25.9", - "@babel/plugin-transform-for-of": "^7.25.9", - "@babel/plugin-transform-function-name": "^7.25.9", - "@babel/plugin-transform-json-strings": "^7.25.9", - "@babel/plugin-transform-literals": "^7.25.9", - "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", - "@babel/plugin-transform-member-expression-literals": "^7.25.9", - "@babel/plugin-transform-modules-amd": "^7.25.9", - "@babel/plugin-transform-modules-commonjs": "^7.25.9", - "@babel/plugin-transform-modules-systemjs": "^7.25.9", - "@babel/plugin-transform-modules-umd": "^7.25.9", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", - "@babel/plugin-transform-new-target": "^7.25.9", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.9", - "@babel/plugin-transform-numeric-separator": "^7.25.9", - "@babel/plugin-transform-object-rest-spread": "^7.25.9", - "@babel/plugin-transform-object-super": "^7.25.9", - "@babel/plugin-transform-optional-catch-binding": "^7.25.9", - "@babel/plugin-transform-optional-chaining": "^7.25.9", - "@babel/plugin-transform-parameters": "^7.25.9", - "@babel/plugin-transform-private-methods": "^7.25.9", - "@babel/plugin-transform-private-property-in-object": "^7.25.9", - "@babel/plugin-transform-property-literals": "^7.25.9", - "@babel/plugin-transform-regenerator": "^7.25.9", - "@babel/plugin-transform-regexp-modifiers": "^7.26.0", - "@babel/plugin-transform-reserved-words": "^7.25.9", - "@babel/plugin-transform-shorthand-properties": "^7.25.9", - "@babel/plugin-transform-spread": "^7.25.9", - "@babel/plugin-transform-sticky-regex": "^7.25.9", - "@babel/plugin-transform-template-literals": "^7.25.9", - "@babel/plugin-transform-typeof-symbol": "^7.25.9", - "@babel/plugin-transform-unicode-escapes": "^7.25.9", - "@babel/plugin-transform-unicode-property-regex": "^7.25.9", - "@babel/plugin-transform-unicode-regex": "^7.25.9", - "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", - "@babel/preset-modules": "0.1.6-no-external-plugins", - "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.6", - "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.38.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-flow": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/preset-flow/-/preset-flow-7.25.9.tgz", - "integrity": "sha512-EASHsAhE+SSlEzJ4bzfusnXSHiU+JfAYzj+jbw2vgQKgq5HrUr8qs+vgtiEL5dOH6sEweI+PNt2D7AqrDSHyqQ==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-transform-flow-strip-types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/preset-modules": { - "version": "0.1.6-no-external-plugins", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", - "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/preset-typescript": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.26.0.tgz", - "integrity": "sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/helper-validator-option": "^7.25.9", - "@babel/plugin-syntax-jsx": "^7.25.9", - "@babel/plugin-transform-modules-commonjs": "^7.25.9", - "@babel/plugin-transform-typescript": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/register": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.25.9.tgz", - "integrity": "sha512-8D43jXtGsYmEeDvm4MWHYUpWf8iiXgWYx3fW7E7Wb7Oe6FWqJPl5K6TuFW0dOwNZzEE5rjlaSJYH9JjrUKJszA==", - "peer": true, - "dependencies": { - "clone-deep": "^4.0.1", - "find-cache-dir": "^2.0.0", - "make-dir": "^2.1.0", - "pirates": "^4.0.6", - "source-map-support": "^0.5.16" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/register/node_modules/find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "peer": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@babel/register/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "peer": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@babel/register/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "peer": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@babel/register/node_modules/make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "peer": true, - "dependencies": { - "pify": "^4.0.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@babel/register/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "peer": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@babel/register/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/register/node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@babel/register/node_modules/pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "peer": true, - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@babel/register/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "peer": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/@babel/runtime": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", - "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/runtime-corejs3": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.26.0.tgz", - "integrity": "sha512-YXHu5lN8kJCb1LOb9PgV6pvak43X2h4HvRApcN5SdWeaItQOzfn1hgP6jasD6KWQyJDBxrVmA9o9OivlnNJK/w==", - "dev": true, - "dependencies": { - "core-js-pure": "^3.30.2", - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", - "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", - "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz", - "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==", - "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/generator": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/template": "^7.25.9", - "@babel/types": "^7.25.9", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse--for-generate-function-map": { - "name": "@babel/traverse", - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz", - "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.25.9", - "@babel/generator": "^7.25.9", - "@babel/parser": "^7.25.9", - "@babel/template": "^7.25.9", - "@babel/types": "^7.25.9", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", - "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", - "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@cypress/code-coverage": { - "version": "3.13.5", - "resolved": "https://registry.npmjs.org/@cypress/code-coverage/-/code-coverage-3.13.5.tgz", - "integrity": "sha512-lnzHWnYgSk/MQRgKJOWg5QKbMgUerz+wvYuf2RzsHfDLFez9CLj4fZOSymJ/QkotfSDgLrerfGASLwHm4OH3qg==", - "dev": true, - "dependencies": { - "@cypress/webpack-preprocessor": "^6.0.0", - "chalk": "4.1.2", - "dayjs": "1.11.13", - "debug": "4.3.7", - "execa": "4.1.0", - "globby": "11.1.0", - "istanbul-lib-coverage": "^3.0.0", - "js-yaml": "4.1.0", - "nyc": "15.1.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.1", - "@babel/preset-env": "^7.0.0", - "babel-loader": "^8.3 || ^9", - "cypress": "*", - "webpack": "^4 || ^5" - } - }, - "node_modules/@cypress/request": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.6.tgz", - "integrity": "sha512-fi0eVdCOtKu5Ed6+E8mYxUF6ZTFJDZvHogCBelM0xVXmrDEkyM22gRArQzq1YcHPm1V47Vf/iAD+WgVdUlJCGg==", - "dev": true, - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~4.0.0", - "http-signature": "~1.4.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "performance-now": "^2.1.0", - "qs": "6.13.0", - "safe-buffer": "^5.1.2", - "tough-cookie": "^5.0.0", - "tunnel-agent": "^0.6.0", - "uuid": "^8.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@cypress/request/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@cypress/webpack-preprocessor": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@cypress/webpack-preprocessor/-/webpack-preprocessor-6.0.2.tgz", - "integrity": "sha512-0+1+4iy4W9PE6R5ywBNKAZoFp8Sf//w3UJ+CKTqkcAjA29b+dtsD0iFT70DsYE0BMqUM1PO7HXFGbXllQ+bRAA==", - "dev": true, - "dependencies": { - "bluebird": "3.7.1", - "debug": "^4.3.4", - "lodash": "^4.17.20" - }, - "peerDependencies": { - "@babel/core": "^7.0.1", - "@babel/preset-env": "^7.0.0", - "babel-loader": "^8.3 || ^9", - "webpack": "^4 || ^5" - } - }, - "node_modules/@cypress/xvfb": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", - "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", - "dev": true, - "dependencies": { - "debug": "^3.1.0", - "lodash.once": "^4.1.1" - } - }, - "node_modules/@cypress/xvfb/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/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@emoji-mart/data": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emoji-mart/data/-/data-1.2.1.tgz", - "integrity": "sha512-no2pQMWiBy6gpBEiqGeU77/bFejDqUTRY7KX+0+iur13op3bqUsXdnwoZs6Xb1zbv0gAj5VvS1PWoUUckSr5Dw==" - }, - "node_modules/@emoji-mart/react": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@emoji-mart/react/-/react-1.1.1.tgz", - "integrity": "sha512-NMlFNeWgv1//uPsvLxvGQoIerPuVdXwK/EUek8OOkJ6wVOWPUizRBJU0hDqWZCOROVpfBgCemaC3m6jDOXi03g==", - "peerDependencies": { - "emoji-mart": "^5.2", - "react": "^16.8 || ^17 || ^18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz", - "integrity": "sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", - "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", - "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.4.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/eslintrc/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/@eslint/eslintrc/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/@floating-ui/core": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.8.tgz", - "integrity": "sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==", - "dependencies": { - "@floating-ui/utils": "^0.2.8" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.6.12", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.12.tgz", - "integrity": "sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==", - "dependencies": { - "@floating-ui/core": "^1.6.0", - "@floating-ui/utils": "^0.2.8" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.8.tgz", - "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==" - }, - "node_modules/@fortawesome/fontawesome-common-types": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.6.0.tgz", - "integrity": "sha512-xyX0X9mc0kyz9plIyryrRbl7ngsA9jz77mCZJsUkLl+ZKs0KWObgaEBoSgQiYWAsSmjz/yjl0F++Got0Mdp4Rw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/fontawesome-svg-core": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.6.0.tgz", - "integrity": "sha512-KHwPkCk6oRT4HADE7smhfsKudt9N/9lm6EJ5BVg0tD1yPA5hht837fB87F8pn15D8JfTqQOjhKTktwmLMiD7Kg==", - "dependencies": { - "@fortawesome/fontawesome-common-types": "6.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/free-brands-svg-icons": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.6.0.tgz", - "integrity": "sha512-1MPD8lMNW/earme4OQi1IFHtmHUwAKgghXlNwWi9GO7QkTfD+IIaYpIai4m2YJEzqfEji3jFHX1DZI5pbY/biQ==", - "dependencies": { - "@fortawesome/fontawesome-common-types": "6.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/free-solid-svg-icons": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.6.0.tgz", - "integrity": "sha512-IYv/2skhEDFc2WGUcqvFJkeK39Q+HyPf5GHUrT/l2pKbtgEIv1al1TKd6qStR5OIwQdN1GZP54ci3y4mroJWjA==", - "dependencies": { - "@fortawesome/fontawesome-common-types": "6.6.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/react-fontawesome": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.2.tgz", - "integrity": "sha512-EnkrprPNqI6SXJl//m29hpaNzOp1bruISWaOiRtkMi/xSvHJlzc2j2JAYS7egxt/EbjSNV/k6Xy0AQI6vB2+1g==", - "dependencies": { - "prop-types": "^15.8.1" - }, - "peerDependencies": { - "@fortawesome/fontawesome-svg-core": "~1 || ~6", - "react": ">=16.3" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.10.7", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.7.tgz", - "integrity": "sha512-MDl6D6sBsaV452/QSdX+4CXIjZhIcI0PELsxUjk4U828yd58vk3bTIvk/6w5FY+4hIy9sLW0sfrV7K7Kc++j/w==", - "deprecated": "Use @eslint/config-array instead", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/gitignore-to-minimatch": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/gitignore-to-minimatch/-/gitignore-to-minimatch-1.0.2.tgz", - "integrity": "sha512-rSqmMJDdLFUsyxR6FMtD00nfQKKLFb1kv+qBbOVKqErvloEIJLo5bDTJTQNTYgeyp78JsA7u/NPi5jT1GR/MuA==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "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": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "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.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/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/@isaacs/cliui/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/@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/@isaacs/cliui/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/@isaacs/ttlcache": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", - "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==", - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/create-cache-key-function": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz", - "integrity": "sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==", - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "peer": true, - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "peer": true, - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "peer": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform/node_modules/write-file-atomic": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", - "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", - "peer": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "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==", - "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==", - "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==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "peer": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "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==" - }, - "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==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@juggle/resize-observer": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz", - "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==" - }, - "node_modules/@next/bundle-analyzer": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/@next/bundle-analyzer/-/bundle-analyzer-15.0.2.tgz", - "integrity": "sha512-bV566k+rDsaqXSUgHBof0iMIDx5DWtLx/98jvYtqb9x85e+WJzv+8cpDvbjtxQMf7nFC/LUkPmpruj1cOKfz4A==", - "dev": true, - "dependencies": { - "webpack-bundle-analyzer": "4.10.1" - } - }, - "node_modules/@next/env": { - "version": "14.2.16", - "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.16.tgz", - "integrity": "sha512-fLrX5TfJzHCbnZ9YUSnGW63tMV3L4nSfhgOQ0iCcX21Pt+VSTDuaLsSuL8J/2XAiVA5AnzvXDpf6pMs60QxOag==" - }, - "node_modules/@next/eslint-plugin-next": { - "version": "13.5.7", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-13.5.7.tgz", - "integrity": "sha512-c4vuEOOXeib4js5gDq+zFqAAdRGXX6T0d+zFETiQkRwy7vyj5lBov1dW0Z09nDst2lvxo7VEcKrQMUBH5Vgx7Q==", - "dev": true, - "dependencies": { - "glob": "7.1.7" - } - }, - "node_modules/@next/swc-darwin-arm64": { - "version": "14.2.16", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.16.tgz", - "integrity": "sha512-uFT34QojYkf0+nn6MEZ4gIWQ5aqGF11uIZ1HSxG+cSbj+Mg3+tYm8qXYd3dKN5jqKUm5rBVvf1PBRO/MeQ6rxw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-darwin-x64": { - "version": "14.2.16", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.16.tgz", - "integrity": "sha512-mCecsFkYezem0QiZlg2bau3Xul77VxUD38b/auAjohMA22G9KTJneUYMv78vWoCCFkleFAhY1NIvbyjj1ncG9g==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "14.2.16", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.16.tgz", - "integrity": "sha512-yhkNA36+ECTC91KSyZcgWgKrYIyDnXZj8PqtJ+c2pMvj45xf7y/HrgI17hLdrcYamLfVt7pBaJUMxADtPaczHA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "14.2.16", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.16.tgz", - "integrity": "sha512-X2YSyu5RMys8R2lA0yLMCOCtqFOoLxrq2YbazFvcPOE4i/isubYjkh+JCpRmqYfEuCVltvlo+oGfj/b5T2pKUA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "14.2.16", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.16.tgz", - "integrity": "sha512-9AGcX7VAkGbc5zTSa+bjQ757tkjr6C/pKS7OK8cX7QEiK6MHIIezBLcQ7gQqbDW2k5yaqba2aDtaBeyyZh1i6Q==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "14.2.16", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.16.tgz", - "integrity": "sha512-Klgeagrdun4WWDaOizdbtIIm8khUDQJ/5cRzdpXHfkbY91LxBXeejL4kbZBrpR/nmgRrQvmz4l3OtttNVkz2Sg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "14.2.16", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.16.tgz", - "integrity": "sha512-PwW8A1UC1Y0xIm83G3yFGPiOBftJK4zukTmk7DI1CebyMOoaVpd8aSy7K6GhobzhkjYvqS/QmzcfsWG2Dwizdg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-ia32-msvc": { - "version": "14.2.16", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.16.tgz", - "integrity": "sha512-jhPl3nN0oKEshJBNDAo0etGMzv0j3q3VYorTSFqH1o3rwv1MQRdor27u1zhkgsHPNeY1jxcgyx1ZsCkDD1IHgg==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "14.2.16", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.16.tgz", - "integrity": "sha512-OA7NtfxgirCjfqt+02BqxC3MIgM/JaGjw9tOe4fyZgPsqfseNiMPnCRP44Pfs+Gpo9zPN+SXaFsgP6vk8d571A==", - "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/@nolyfill/is-core-module": { - "version": "1.0.39", - "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", - "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", - "dev": true, - "engines": { - "node": ">=12.4.0" - } - }, - "node_modules/@parcel/watcher": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.4.1.tgz", - "integrity": "sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==", - "devOptional": true, - "dependencies": { - "detect-libc": "^1.0.3", - "is-glob": "^4.0.3", - "micromatch": "^4.0.5", - "node-addon-api": "^7.0.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.4.1", - "@parcel/watcher-darwin-arm64": "2.4.1", - "@parcel/watcher-darwin-x64": "2.4.1", - "@parcel/watcher-freebsd-x64": "2.4.1", - "@parcel/watcher-linux-arm-glibc": "2.4.1", - "@parcel/watcher-linux-arm64-glibc": "2.4.1", - "@parcel/watcher-linux-arm64-musl": "2.4.1", - "@parcel/watcher-linux-x64-glibc": "2.4.1", - "@parcel/watcher-linux-x64-musl": "2.4.1", - "@parcel/watcher-win32-arm64": "2.4.1", - "@parcel/watcher-win32-ia32": "2.4.1", - "@parcel/watcher-win32-x64": "2.4.1" - } - }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz", - "integrity": "sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.1.tgz", - "integrity": "sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.1.tgz", - "integrity": "sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.1.tgz", - "integrity": "sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.1.tgz", - "integrity": "sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.1.tgz", - "integrity": "sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.1.tgz", - "integrity": "sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz", - "integrity": "sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz", - "integrity": "sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.1.tgz", - "integrity": "sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.1.tgz", - "integrity": "sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.1.tgz", - "integrity": "sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "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/@pkgr/core": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", - "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.28", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", - "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==", - "dev": true - }, - "node_modules/@react-native/assets-registry": { - "version": "0.76.1", - "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.76.1.tgz", - "integrity": "sha512-1mcDjyvC4Z+XYtY+Abl6pW9P49l/9HJmRChX7EHF1SoXe7zPAPBoAqeZsJNtf8dhJR3u/eGvapr1yJq8T/psEg==", - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/babel-plugin-codegen": { - "version": "0.76.1", - "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.76.1.tgz", - "integrity": "sha512-V9bGLyEdAF39nvn4L5gaJcPX1SvCHPJhaT3qfpVGvCnl7WPhdRyCq++WsN8HXlpo6WOAf6//oruLnLdl3RNM4Q==", - "peer": true, - "dependencies": { - "@react-native/codegen": "0.76.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/babel-preset": { - "version": "0.76.1", - "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.76.1.tgz", - "integrity": "sha512-b6YRmA13CmVuTQKHRen/Q0glHwmZFZoEDs+MJ1NL0UNHq9V5ytvdwTW1ntkmjtXuTnPMzkwYvumJBN9UTZjkBA==", - "peer": true, - "dependencies": { - "@babel/core": "^7.25.2", - "@babel/plugin-proposal-export-default-from": "^7.24.7", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-default-from": "^7.24.7", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-transform-arrow-functions": "^7.24.7", - "@babel/plugin-transform-async-generator-functions": "^7.25.4", - "@babel/plugin-transform-async-to-generator": "^7.24.7", - "@babel/plugin-transform-block-scoping": "^7.25.0", - "@babel/plugin-transform-class-properties": "^7.25.4", - "@babel/plugin-transform-classes": "^7.25.4", - "@babel/plugin-transform-computed-properties": "^7.24.7", - "@babel/plugin-transform-destructuring": "^7.24.8", - "@babel/plugin-transform-flow-strip-types": "^7.25.2", - "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-function-name": "^7.25.1", - "@babel/plugin-transform-literals": "^7.25.2", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.8", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", - "@babel/plugin-transform-numeric-separator": "^7.24.7", - "@babel/plugin-transform-object-rest-spread": "^7.24.7", - "@babel/plugin-transform-optional-catch-binding": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.8", - "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.24.7", - "@babel/plugin-transform-private-property-in-object": "^7.24.7", - "@babel/plugin-transform-react-display-name": "^7.24.7", - "@babel/plugin-transform-react-jsx": "^7.25.2", - "@babel/plugin-transform-react-jsx-self": "^7.24.7", - "@babel/plugin-transform-react-jsx-source": "^7.24.7", - "@babel/plugin-transform-regenerator": "^7.24.7", - "@babel/plugin-transform-runtime": "^7.24.7", - "@babel/plugin-transform-shorthand-properties": "^7.24.7", - "@babel/plugin-transform-spread": "^7.24.7", - "@babel/plugin-transform-sticky-regex": "^7.24.7", - "@babel/plugin-transform-typescript": "^7.25.2", - "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@babel/template": "^7.25.0", - "@react-native/babel-plugin-codegen": "0.76.1", - "babel-plugin-syntax-hermes-parser": "^0.23.1", - "babel-plugin-transform-flow-enums": "^0.0.2", - "react-refresh": "^0.14.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@babel/core": "*" - } - }, - "node_modules/@react-native/codegen": { - "version": "0.76.1", - "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.76.1.tgz", - "integrity": "sha512-7lE0hk2qq27wVeK5eF654v7XsKoRa7ficrfSwIDEDZ1aLB2xgUzLrsq+glSAP9EuzT6ycHhtD3QyqI+TqnlS/A==", - "peer": true, - "dependencies": { - "@babel/parser": "^7.25.3", - "glob": "^7.1.1", - "hermes-parser": "0.23.1", - "invariant": "^2.2.4", - "jscodeshift": "^0.14.0", - "mkdirp": "^0.5.1", - "nullthrows": "^1.1.1", - "yargs": "^17.6.2" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@babel/preset-env": "^7.1.6" - } - }, - "node_modules/@react-native/codegen/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "peer": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@react-native/codegen/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/@react-native/codegen/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "peer": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@react-native/codegen/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@react-native/community-cli-plugin": { - "version": "0.76.1", - "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.76.1.tgz", - "integrity": "sha512-dECc1LuleMQDX/WK2oJInrYCpHb3OFBJxYkhPOAXb9HiktMWRA9T93qqpTDshmtLdYqvxeO9AM5eeoSL412WnQ==", - "peer": true, - "dependencies": { - "@react-native/dev-middleware": "0.76.1", - "@react-native/metro-babel-transformer": "0.76.1", - "chalk": "^4.0.0", - "execa": "^5.1.1", - "invariant": "^2.2.4", - "metro": "^0.81.0", - "metro-config": "^0.81.0", - "metro-core": "^0.81.0", - "node-fetch": "^2.2.0", - "readline": "^1.3.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@react-native-community/cli-server-api": "*" - }, - "peerDependenciesMeta": { - "@react-native-community/cli-server-api": { - "optional": true - } - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "peer": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native/community-cli-plugin/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "peer": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/@react-native/debugger-frontend": { - "version": "0.76.1", - "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.76.1.tgz", - "integrity": "sha512-0gExx7GR8o2ctGfjIZ9+x54iFbg0eP6+kMYzRA6AcgmFAmMGLADMmjtObCN0CqGeZyWtdVVqcv5mAwRwmMlNWA==", - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/dev-middleware": { - "version": "0.76.1", - "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.76.1.tgz", - "integrity": "sha512-htaFSN2dwI0CinsMxjRuvIVdSDN6d6TDPeOJczM1bdAYalZX1M58knTKs5LJDComW5tleOCAg5lS5tIeFlM9+Q==", - "peer": true, - "dependencies": { - "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.76.1", - "chrome-launcher": "^0.15.2", - "chromium-edge-launcher": "^0.2.0", - "connect": "^3.6.5", - "debug": "^2.2.0", - "nullthrows": "^1.1.1", - "open": "^7.0.3", - "selfsigned": "^2.4.1", - "serve-static": "^1.13.1", - "ws": "^6.2.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/dev-middleware/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/@react-native/dev-middleware/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "peer": true - }, - "node_modules/@react-native/gradle-plugin": { - "version": "0.76.1", - "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.76.1.tgz", - "integrity": "sha512-X7rNFltPa9QYxvYrQGaSCw7U57C+y+DwspXf4AnLZj0bQm9tL6UYpijh5vE3VmPcHn76/RNU2bpFjVvWg6gjqw==", - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/js-polyfills": { - "version": "0.76.1", - "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.76.1.tgz", - "integrity": "sha512-HO3fzJ0FnrnQGmxdXxh2lcGGAMfaX9h1Pg1Zh38MkVw35/KnZHxHqxg6cruze6iWwZdfqSoIcQoalmMuAHby7Q==", - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/@react-native/metro-babel-transformer": { - "version": "0.76.1", - "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.76.1.tgz", - "integrity": "sha512-LUAKqgsrioXS2a+pE0jak8sutTbLo3T34KWv7mdVUZ5lUACpqkIql1EFtIQlWjIcR4oZE480CkPbRHBI681tkQ==", - "peer": true, - "dependencies": { - "@babel/core": "^7.25.2", - "@react-native/babel-preset": "0.76.1", - "hermes-parser": "0.23.1", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@babel/core": "*" - } - }, - "node_modules/@react-native/normalize-colors": { - "version": "0.76.1", - "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.76.1.tgz", - "integrity": "sha512-/+CUk/wGWIdXbJYVLw/q6Fs8Z0x91zzfXIbNiZUdSW1TNEDmytkF371H8a1/Nx3nWa1RqCMVsaZHCG4zqxeDvg==", - "peer": true - }, - "node_modules/@react-native/virtualized-lists": { - "version": "0.76.1", - "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.76.1.tgz", - "integrity": "sha512-uWJfv0FC3zmlYORr0Sa17ngbAaw6K9yw4MAkBZyFeTM+W6AJRvTVyR1Mes/MU+vIyGFChnTcyaQrQz8jWqADOA==", - "peer": true, - "dependencies": { - "invariant": "^2.2.4", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/react": "^18.2.6", - "react": "*", - "react-native": "*" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@react-oauth/google": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@react-oauth/google/-/google-0.9.1.tgz", - "integrity": "sha512-SbTTvt6wiCxHxQbuzlQJZBbXI1aLxPNkAZcukB1S+wEs2vCj5rG9QbZ26nP521n82n1SrpbxaVKYXMt+7GVHhw==", - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@react-spring/animated": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.5.tgz", - "integrity": "sha512-Tqrwz7pIlsSDITzxoLS3n/v/YCUHQdOIKtOJf4yL6kYVSDTSmVK1LI1Q3M/uu2Sx4X3pIWF3xLUhlsA6SPNTNg==", - "dependencies": { - "@react-spring/shared": "~9.7.5", - "@react-spring/types": "~9.7.5" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-spring/core": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.7.5.tgz", - "integrity": "sha512-rmEqcxRcu7dWh7MnCcMXLvrf6/SDlSokLaLTxiPlAYi11nN3B5oiCUAblO72o+9z/87j2uzxa2Inm8UbLjXA+w==", - "dependencies": { - "@react-spring/animated": "~9.7.5", - "@react-spring/shared": "~9.7.5", - "@react-spring/types": "~9.7.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/react-spring/donate" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-spring/konva": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/konva/-/konva-9.7.5.tgz", - "integrity": "sha512-BelrmyY6w0FGoNSEfSJltjQDUoW0Prxf+FzGjyLuLs+V9M9OM/aHnYqOlvQEfQsZx6C/ZiDOn5BZl8iH8SDf+Q==", - "dependencies": { - "@react-spring/animated": "~9.7.5", - "@react-spring/core": "~9.7.5", - "@react-spring/shared": "~9.7.5", - "@react-spring/types": "~9.7.5" - }, - "peerDependencies": { - "konva": ">=2.6", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-konva": "^16.8.0 || ^16.8.7-0 || ^16.9.0-0 || ^16.10.1-0 || ^16.12.0-0 || ^16.13.0-0 || ^17.0.0-0 || ^17.0.1-0 || ^17.0.2-0 || ^18.0.0-0" - } - }, - "node_modules/@react-spring/native": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/native/-/native-9.7.5.tgz", - "integrity": "sha512-C1S500BNP1I05MftElyLv2nIqaWQ0MAByOAK/p4vuXcUK3XcjFaAJ385gVLgV2rgKfvkqRoz97PSwbh+ZCETEg==", - "dependencies": { - "@react-spring/animated": "~9.7.5", - "@react-spring/core": "~9.7.5", - "@react-spring/shared": "~9.7.5", - "@react-spring/types": "~9.7.5" - }, - "peerDependencies": { - "react": "16.8.0 || >=17.0.0 || >=18.0.0", - "react-native": ">=0.58" - } - }, - "node_modules/@react-spring/rafz": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.7.5.tgz", - "integrity": "sha512-5ZenDQMC48wjUzPAm1EtwQ5Ot3bLIAwwqP2w2owG5KoNdNHpEJV263nGhCeKKmuA3vG2zLLOdu3or6kuDjA6Aw==" - }, - "node_modules/@react-spring/shared": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.7.5.tgz", - "integrity": "sha512-wdtoJrhUeeyD/PP/zo+np2s1Z820Ohr/BbuVYv+3dVLW7WctoiN7std8rISoYoHpUXtbkpesSKuPIw/6U1w1Pw==", - "dependencies": { - "@react-spring/rafz": "~9.7.5", - "@react-spring/types": "~9.7.5" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-spring/three": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/three/-/three-9.7.5.tgz", - "integrity": "sha512-RxIsCoQfUqOS3POmhVHa1wdWS0wyHAUway73uRLp3GAL5U2iYVNdnzQsep6M2NZ994BlW8TcKuMtQHUqOsy6WA==", - "dependencies": { - "@react-spring/animated": "~9.7.5", - "@react-spring/core": "~9.7.5", - "@react-spring/shared": "~9.7.5", - "@react-spring/types": "~9.7.5" - }, - "peerDependencies": { - "@react-three/fiber": ">=6.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "three": ">=0.126" - } - }, - "node_modules/@react-spring/types": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.7.5.tgz", - "integrity": "sha512-HVj7LrZ4ReHWBimBvu2SKND3cDVUPWKLqRTmWe/fNY6o1owGOX0cAHbdPDTMelgBlVbrTKrre6lFkhqGZErK/g==" - }, - "node_modules/@react-spring/web": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/web/-/web-9.7.5.tgz", - "integrity": "sha512-lmvqGwpe+CSttsWNZVr+Dg62adtKhauGwLyGE/RRyZ8AAMLgb9x3NDMA5RMElXo+IMyTkPp7nxTB8ZQlmhb6JQ==", - "dependencies": { - "@react-spring/animated": "~9.7.5", - "@react-spring/core": "~9.7.5", - "@react-spring/shared": "~9.7.5", - "@react-spring/types": "~9.7.5" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@react-spring/zdog": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/zdog/-/zdog-9.7.5.tgz", - "integrity": "sha512-VV7vmb52wGHgDA1ry6hv+QgxTs78fqjKEQnj+M8hiBg+dwOsTtqqM24ADtc4cMAhPW+eZhVps8ZNKtjt8ouHFA==", - "dependencies": { - "@react-spring/animated": "~9.7.5", - "@react-spring/core": "~9.7.5", - "@react-spring/shared": "~9.7.5", - "@react-spring/types": "~9.7.5" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-zdog": ">=1.0", - "zdog": ">=1.0" - } - }, - "node_modules/@react-three/fiber": { - "version": "8.17.10", - "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-8.17.10.tgz", - "integrity": "sha512-S6bqa4DqUooEkInYv/W+Jklv2zjSYCXAhm6qKpAQyOXhTEt5gBXnA7W6aoJ0bjmp9pAeaSj/AZUoz1HCSof/uA==", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.17.8", - "@types/debounce": "^1.2.1", - "@types/react-reconciler": "^0.26.7", - "@types/webxr": "*", - "base64-js": "^1.5.1", - "buffer": "^6.0.3", - "debounce": "^1.2.1", - "its-fine": "^1.0.6", - "react-reconciler": "^0.27.0", - "scheduler": "^0.21.0", - "suspend-react": "^0.1.3", - "zustand": "^3.7.1" - }, - "peerDependencies": { - "expo": ">=43.0", - "expo-asset": ">=8.4", - "expo-file-system": ">=11.0", - "expo-gl": ">=11.0", - "react": ">=18.0", - "react-dom": ">=18.0", - "react-native": ">=0.64", - "three": ">=0.133" - }, - "peerDependenciesMeta": { - "expo": { - "optional": true - }, - "expo-asset": { - "optional": true - }, - "expo-file-system": { - "optional": true - }, - "expo-gl": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/@react-three/fiber/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peer": true, - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/@react-three/fiber/node_modules/scheduler": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz", - "integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/@reduxjs/toolkit": { - "version": "1.9.7", - "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.7.tgz", - "integrity": "sha512-t7v8ZPxhhKgOKtU+uyJT13lu4vL7az5aFi4IdoDs/eS548edn2M8Ik9h8fxgvMjGoAUVFSt6ZC1P5cWmQ014QQ==", - "dependencies": { - "immer": "^9.0.21", - "redux": "^4.2.1", - "redux-thunk": "^2.4.2", - "reselect": "^4.1.8" - }, - "peerDependencies": { - "react": "^16.9.0 || ^17.0.0 || ^18", - "react-redux": "^7.2.1 || ^8.0.2" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-redux": { - "optional": true - } - } - }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", - "dev": true - }, - "node_modules/@rushstack/eslint-patch": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz", - "integrity": "sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==", - "dev": true - }, - "node_modules/@selderee/plugin-htmlparser2": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@selderee/plugin-htmlparser2/-/plugin-htmlparser2-0.11.0.tgz", - "integrity": "sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==", - "dependencies": { - "domhandler": "^5.0.3", - "selderee": "^0.11.0" - }, - "funding": { - "url": "https://ko-fi.com/killymxi" - } - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "peer": true - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "peer": true, - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "peer": true, - "dependencies": { - "@sinonjs/commons": "^3.0.0" - } - }, - "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/@testing-library/cypress": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@testing-library/cypress/-/cypress-10.0.2.tgz", - "integrity": "sha512-dKv95Bre5fDmNb9tOIuWedhGUryxGu1GWYWtXDqUsDPcr9Ekld0fiTb+pcBvSsFpYXAZSpmyEjhoXzLbhh06yQ==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.14.6", - "@testing-library/dom": "^10.1.0" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - }, - "peerDependencies": { - "cypress": "^12.0.0 || ^13.0.0" - } - }, - "node_modules/@testing-library/dom": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", - "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.3.0", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@types/aria-query": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", - "dev": true - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "peer": true, - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", - "peer": true, - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "peer": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", - "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", - "peer": true, - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/contrast-color": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/contrast-color/-/contrast-color-1.0.3.tgz", - "integrity": "sha512-D4xFbzgt7p6o2I6e6vxxbSuDw8VbTDb6XGurz2MFi39WmmlDRmPvEcATqsfLShLM8GxrhZ0gWT+9VdGnC1DCTA==", - "dev": true - }, - "node_modules/@types/debounce": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/debounce/-/debounce-1.2.4.tgz", - "integrity": "sha512-jBqiORIzKDOToaF63Fm//haOCHuwQuLa2202RK4MozpA6lh93eCBc+/8+wZn5OzjJt3ySdc+74SXWXB55Ewtyw==", - "peer": true - }, - "node_modules/@types/dompurify": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/dompurify/-/dompurify-2.4.0.tgz", - "integrity": "sha512-IDBwO5IZhrKvHFUl+clZxgf3hn2b/lU6H1KaBShPkQyGJUQ0xwebezIPSuiyGwfz1UzJWQl4M7BDxtHtCCPlTg==", - "dev": true, - "dependencies": { - "@types/trusted-types": "*" - } - }, - "node_modules/@types/draft-js": { - "version": "0.11.18", - "resolved": "https://registry.npmjs.org/@types/draft-js/-/draft-js-0.11.18.tgz", - "integrity": "sha512-lP6yJ+EKv5tcG1dflWgDKeezdwBa8wJ7KkiNrrHqXuXhl/VGes1SKjEfKHDZqOz19KQbrAhFvNhDPWwnQXYZGQ==", - "dev": true, - "dependencies": { - "@types/react": "*", - "immutable": "~3.7.4" - } - }, - "node_modules/@types/draftjs-to-html": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/@types/draftjs-to-html/-/draftjs-to-html-0.8.4.tgz", - "integrity": "sha512-5FZcjFoJL57N/IttLCTCNI0krX+181oCl5hf76u3TqPkqBAphHrJAO9ReYesx9138kcObaYmpnWC2Yrqxoqd2Q==", - "dev": true, - "dependencies": { - "@types/draft-js": "*" - } - }, - "node_modules/@types/emoji-mart": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/@types/emoji-mart/-/emoji-mart-3.0.14.tgz", - "integrity": "sha512-/vMkVnet466bK37ugf2jry9ldCZklFPXYMB2m+qNo3vkP2I7L0cvtNFPKAjfcHgPg9Z8pbYqVqZn7AgsC0qf+g==", - "dev": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true, - "peer": true - }, - "node_modules/@types/file-saver": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/file-saver/-/file-saver-2.0.7.tgz", - "integrity": "sha512-dNKVfHd/jk0SkR/exKGj2ggkB45MAkzvWCaqLUUgkyjITkGNzH8H+yUwr+BLJUBjZOe9w8X3wgmXhZDRg1ED6A==", - "dev": true - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", - "peer": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/hoist-non-react-statics": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", - "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==", - "dependencies": { - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0" - } - }, - "node_modules/@types/html-to-text": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/@types/html-to-text/-/html-to-text-9.0.4.tgz", - "integrity": "sha512-pUY3cKH/Nm2yYrEmDlPR1mR7yszjGx4DrwPjQ702C4/D5CwHuZTgZdIdwPkRbcuhs7BAh2L5rg3CL5cbRiGTCQ==", - "dev": true - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/js-cookie": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@types/js-cookie/-/js-cookie-3.0.6.tgz", - "integrity": "sha512-wkw9yd1kEXOPnvEeEV1Go1MmxtBJL0RR79aOTAApecWFVu7w0NNXNqhcWgvw2YgZDYadliXkl14pa3WXw5jlCQ==", - "dev": true - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, - "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/lodash": { - "version": "4.17.13", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.13.tgz", - "integrity": "sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==", - "dev": true - }, - "node_modules/@types/node": { - "version": "18.7.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.14.tgz", - "integrity": "sha512-6bbDaETVi8oyIARulOE9qF1/Qdi/23z6emrUh0fNJRUmjznqrixD4MpGDdgOFk5Xb0m2H6Xu42JGdvAxaJR/wA==" - }, - "node_modules/@types/node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", - "peer": true, - "dependencies": { - "@types/node": "*", - "form-data": "^4.0.0" - } - }, - "node_modules/@types/node-forge": { - "version": "1.3.11", - "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", - "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", - "peer": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/prop-types": { - "version": "15.7.13", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", - "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==" - }, - "node_modules/@types/quill": { - "version": "1.3.10", - "resolved": "https://registry.npmjs.org/@types/quill/-/quill-1.3.10.tgz", - "integrity": "sha512-IhW3fPW+bkt9MLNlycw8u8fWb7oO7W5URC9MfZYHBlA24rex9rs23D5DETChu1zvgVdc5ka64ICjJOgQMr6Shw==", - "dependencies": { - "parchment": "^1.1.2" - } - }, - "node_modules/@types/quill/node_modules/parchment": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz", - "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==" - }, - "node_modules/@types/react": { - "version": "18.3.11", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.11.tgz", - "integrity": "sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ==", - "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/@types/react-draft-wysiwyg": { - "version": "1.13.8", - "resolved": "https://registry.npmjs.org/@types/react-draft-wysiwyg/-/react-draft-wysiwyg-1.13.8.tgz", - "integrity": "sha512-qo0vIHjqAYq3Hz93Td3ecNodgVjKsvrWkBJ6mZXJSUmQzrQ5Fu7NS9oV5PXnVbnuqPoJLALbCSiz8UCksLribg==", - "dev": true, - "dependencies": { - "@types/draft-js": "*", - "@types/react": "*" - } - }, - "node_modules/@types/react-reconciler": { - "version": "0.26.7", - "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.26.7.tgz", - "integrity": "sha512-mBDYl8x+oyPX/VBb3E638N0B7xG+SPk/EAMcVPeexqus/5aTpTphQi0curhhshOqRrc9t6OPoJfEUkbymse/lQ==", - "peer": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/semver": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", - "dev": true - }, - "node_modules/@types/sinonjs__fake-timers": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", - "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==", - "dev": true - }, - "node_modules/@types/sizzle": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.9.tgz", - "integrity": "sha512-xzLEyKB50yqCUPUJkIsrVvoWNfFUbIZI+RspLWt8u+tIW/BetMBZtgV2LY/2o+tYH8dRvQ+eoPf3NdhQCcLE2w==", - "dev": true - }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "peer": true - }, - "node_modules/@types/testing-library__cypress": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/@types/testing-library__cypress/-/testing-library__cypress-5.0.13.tgz", - "integrity": "sha512-lkxNGVFBEX825Z/FrHA8FLuKv1q5L6Bccqm08Zds2MUG4gd5al32hCpplzVumke3br+hkhtVmuPTfwQadIkc5w==", - "dev": true, - "dependencies": { - "@testing-library/dom": "^7.11.0", - "cypress": "*" - } - }, - "node_modules/@types/testing-library__cypress/node_modules/@jest/types": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-26.6.2.tgz", - "integrity": "sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^15.0.0", - "chalk": "^4.0.0" - }, - "engines": { - "node": ">= 10.14.2" - } - }, - "node_modules/@types/testing-library__cypress/node_modules/@testing-library/dom": { - "version": "7.31.2", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-7.31.2.tgz", - "integrity": "sha512-3UqjCpey6HiTZT92vODYLPxTBWlM8ZOOjr3LX5F37/VRipW2M1kX6I/Cm4VXzteZqfGfagg8yXywpcOgQBlNsQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^4.2.0", - "aria-query": "^4.2.2", - "chalk": "^4.1.0", - "dom-accessibility-api": "^0.5.6", - "lz-string": "^1.4.4", - "pretty-format": "^26.6.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@types/testing-library__cypress/node_modules/@types/aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==", - "dev": true - }, - "node_modules/@types/testing-library__cypress/node_modules/@types/yargs": { - "version": "15.0.19", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.19.tgz", - "integrity": "sha512-2XUaGVmyQjgyAZldf0D0c14vvo/yv0MhQBSTJcejMMaitsn3nxCB6TmH4G0ZQf+uxROOa9mpanoSm8h6SG/1ZA==", - "dev": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/testing-library__cypress/node_modules/aria-query": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-4.2.2.tgz", - "integrity": "sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.10.2", - "@babel/runtime-corejs3": "^7.10.2" - }, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/@types/testing-library__cypress/node_modules/pretty-format": { - "version": "26.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-26.6.2.tgz", - "integrity": "sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==", - "dev": true, - "dependencies": { - "@jest/types": "^26.6.2", - "ansi-regex": "^5.0.0", - "ansi-styles": "^4.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", - "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", - "dev": true - }, - "node_modules/@types/use-sync-external-store": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", - "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" - }, - "node_modules/@types/uuid": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", - "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==", - "dev": true - }, - "node_modules/@types/webxr": { - "version": "0.5.20", - "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.20.tgz", - "integrity": "sha512-JGpU6qiIJQKUuVSKx1GtQnHJGxRjtfGIhzO2ilq43VZZS//f1h1Sgexbdk+Lq+7569a6EYhOWrUpIruR/1Enmg==", - "peer": true - }, - "node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", - "peer": true, - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" - }, - "node_modules/@types/yauzl": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", - "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", - "dev": true, - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", - "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/type-utils": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", - "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", - "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true, - "peer": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true, - "peer": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", - "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", - "dev": true, - "peer": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true, - "peer": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", - "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.12.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "dev": true, - "peer": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "dev": true, - "peer": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true, - "peer": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", - "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-opt": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1", - "@webassemblyjs/wast-printer": "1.12.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", - "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", - "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-buffer": "1.12.1", - "@webassemblyjs/wasm-gen": "1.12.1", - "@webassemblyjs/wasm-parser": "1.12.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", - "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", - "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.12.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true, - "peer": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true, - "peer": true - }, - "node_modules/@zeit/schemas": { - "version": "2.36.0", - "resolved": "https://registry.npmjs.org/@zeit/schemas/-/schemas-2.36.0.tgz", - "integrity": "sha512-7kjMwcChYEzMKjeex9ZFXkt1AyNov9R5HZtjBKVsmVpw7pa7ZtlCGvCBC2vnnXctaYN+aRI61HjIqeetZW5ROg==" - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "peer": true, - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", - "dev": true, - "peer": true, - "peerDependencies": { - "acorn": "^8" - } - }, - "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/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dev": true, - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, - "peer": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "peer": true - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peer": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/anser": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", - "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", - "peer": true - }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dependencies": { - "string-width": "^4.1.0" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "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==", - "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==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/append-transform": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", - "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", - "dev": true, - "dependencies": { - "default-require-extensions": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/arch": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", - "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", - "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/archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", - "dev": true - }, - "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==" - }, - "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-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dev": true, - "dependencies": { - "dequal": "^2.0.3" - } - }, - "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.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/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "peer": true - }, - "node_modules/asn1": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", - "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", - "dev": true, - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/ast-types": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.15.2.tgz", - "integrity": "sha512-c27loCv9QkZinsa5ProX751khO9DJl/AcB5c2KNtA6NRvHKS0PgLfcftz72KVq504vB0Gku5s2kUZzDBvQWvHg==", - "peer": true, - "dependencies": { - "tslib": "^2.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "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/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "dev": true - }, - "node_modules/async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "peer": true - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/at-least-node": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", - "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.20", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", - "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "browserslist": "^4.23.3", - "caniuse-lite": "^1.0.30001646", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "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/aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/aws4": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", - "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", - "dev": true - }, - "node_modules/axe-core": { - "version": "4.10.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.2.tgz", - "integrity": "sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/axobject-query": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", - "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/babel-core": { - "version": "7.0.0-bridge.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", - "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", - "peer": true, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/babel-jest": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", - "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", - "peer": true, - "dependencies": { - "@jest/transform": "^29.7.0", - "@types/babel__core": "^7.1.14", - "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.6.3", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.8.0" - } - }, - "node_modules/babel-loader": { - "version": "9.2.1", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", - "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", - "dev": true, - "peer": true, - "dependencies": { - "find-cache-dir": "^4.0.0", - "schema-utils": "^4.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0", - "webpack": ">=5" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", - "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", - "peer": true, - "dependencies": { - "@babel/template": "^7.3.3", - "@babel/types": "^7.3.3", - "@types/babel__core": "^7.1.14", - "@types/babel__traverse": "^7.0.6" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.11", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", - "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", - "peer": true, - "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.2", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.10.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", - "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", - "peer": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2", - "core-js-compat": "^3.38.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", - "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", - "peer": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/babel-plugin-syntax-hermes-parser": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.23.1.tgz", - "integrity": "sha512-uNLD0tk2tLUjGFdmCk+u/3FEw2o+BAwW4g+z2QVlxJrzZYOOPADroEcNtTPt5lNiScctaUmnsTkVEnOwZUOLhA==", - "peer": true, - "dependencies": { - "hermes-parser": "0.23.1" - } - }, - "node_modules/babel-plugin-transform-flow-enums": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-enums/-/babel-plugin-transform-flow-enums-0.0.2.tgz", - "integrity": "sha512-g4aaCrDDOsWjbm0PUUeVnkcVd6AKJsVc/MbnPhEotEpkeJQP6b8nzewohQi7+QS8UyPehOhGWn0nOwjvWpmMvQ==", - "peer": true, - "dependencies": { - "@babel/plugin-syntax-flow": "^7.12.1" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", - "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", - "peer": true, - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/babel-preset-jest": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", - "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", - "peer": true, - "dependencies": { - "babel-plugin-jest-hoist": "^29.6.3", - "babel-preset-current-node-syntax": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "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==" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "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/bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", - "dev": true, - "dependencies": { - "tweetnacl": "^0.14.3" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/blob-util": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", - "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", - "dev": true - }, - "node_modules/bluebird": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.1.tgz", - "integrity": "sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg==", - "dev": true - }, - "node_modules/body-scroll-lock": { - "version": "4.0.0-beta.0", - "resolved": "https://registry.npmjs.org/body-scroll-lock/-/body-scroll-lock-4.0.0-beta.0.tgz", - "integrity": "sha512-a7tP5+0Mw3YlUJcGAKUqIBkYYGlYxk2fnCasq/FUph1hadxlTRjF+gAcZksxANnaMnALjxEddmSi/H3OR8ugcQ==" - }, - "node_modules/boxen": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.0.tgz", - "integrity": "sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==", - "dependencies": { - "ansi-align": "^3.0.1", - "camelcase": "^7.0.0", - "chalk": "^5.0.1", - "cli-boxes": "^3.0.0", - "string-width": "^5.1.2", - "type-fest": "^2.13.0", - "widest-line": "^4.0.1", - "wrap-ansi": "^8.0.1" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/boxen/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==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/boxen/node_modules/camelcase": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", - "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/boxen/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==", - "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/boxen/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==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/boxen/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/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==", - "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/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "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==", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.24.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", - "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001669", - "electron-to-chromium": "^1.5.41", - "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.1" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "peer": true, - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "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": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "peer": true - }, - "node_modules/bundle-require": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-3.1.2.tgz", - "integrity": "sha512-Of6l6JBAxiyQ5axFxUM6dYeP/W7X2Sozeo/4EYB9sJhL+dqL7TKjg+shwxp6jlu/6ZSERfsYtIpSJ1/x3XkAEA==", - "dev": true, - "dependencies": { - "load-tsconfig": "^0.2.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "esbuild": ">=0.13" - } - }, - "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/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cachedir": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.4.0.tgz", - "integrity": "sha512-9EtFOZR8g22CL7BWjJ9BUx1+A/djkofnyW3aOXZORNW2kxoUpx2h+uN2cOqwPmFhnpVmxg+KW2OjOSgChTEvsQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/caching-transform": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", - "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", - "dev": true, - "dependencies": { - "hasha": "^5.0.0", - "make-dir": "^3.0.0", - "package-hash": "^4.0.0", - "write-file-atomic": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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==", - "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/caller-callsite": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", - "peer": true, - "dependencies": { - "callsites": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/caller-callsite/node_modules/callsites": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/caller-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", - "peer": true, - "dependencies": { - "caller-callsite": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "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/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "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.30001676", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001676.tgz", - "integrity": "sha512-Qz6zwGCiPghQXGJvgQAem79esjitvJ+CxSbSQkW9H/UX5hg8XM88d4lp2W+MEQ81j+Hip58Il+jGVdazk1z9cw==", - "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/capital-case": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", - "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", - "dev": true, - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case-first": "^2.0.2" - } - }, - "node_modules/caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", - "dev": true - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chalk-template": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/chalk-template/-/chalk-template-0.4.0.tgz", - "integrity": "sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==", - "dependencies": { - "chalk": "^4.1.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/chalk-template?sponsor=1" - } - }, - "node_modules/change-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", - "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", - "dev": true, - "dependencies": { - "camel-case": "^4.1.2", - "capital-case": "^1.0.4", - "constant-case": "^3.0.4", - "dot-case": "^3.0.4", - "header-case": "^2.0.4", - "no-case": "^3.0.4", - "param-case": "^3.0.4", - "pascal-case": "^3.1.2", - "path-case": "^3.0.4", - "sentence-case": "^3.0.4", - "snake-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/check-more-types": { - "version": "2.24.0", - "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", - "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/chokidar": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", - "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", - "devOptional": true, - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/chrome-launcher": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", - "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", - "peer": true, - "dependencies": { - "@types/node": "*", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^1.0.0" - }, - "bin": { - "print-chrome-path": "bin/print-chrome-path.js" - }, - "engines": { - "node": ">=12.13.0" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/chromium-edge-launcher": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-0.2.0.tgz", - "integrity": "sha512-JfJjUnq25y9yg4FABRRVPmBGWPZZi+AQXT4mxupb67766/0UlhG8PAZCz6xzEMXTbW3CsSoE8PcCWA49n35mKg==", - "peer": true, - "dependencies": { - "@types/node": "*", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^1.0.0", - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - } - }, - "node_modules/chromium-edge-launcher/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "peer": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/classnames": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", - "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" - }, - "node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/cli-boxes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", - "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cli-table3": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", - "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, - "node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/clipboardy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-3.0.0.tgz", - "integrity": "sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==", - "dependencies": { - "arch": "^2.2.0", - "execa": "^5.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clipboardy/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/clipboardy/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clipboardy/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "peer": true, - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "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==", - "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==" - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "dev": true - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", - "dev": true, - "peer": true - }, - "node_modules/common-tags": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", - "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", - "dev": true, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "dev": true - }, - "node_modules/connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", - "peer": true, - "dependencies": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/connect/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/connect/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "peer": true - }, - "node_modules/constant-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", - "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", - "dev": true, - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case": "^2.0.2" - } - }, - "node_modules/content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/contrast-color": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/contrast-color/-/contrast-color-1.0.1.tgz", - "integrity": "sha512-XeTV/LiyWrf/OWnODTqve2YGBfg32N6zlLqQjJKmEY+ffDqIfecgdmluVz7tky1D4VEaweZgoeRJJT87gDSDCQ==", - "engines": { - "npm": ">= 4.0.0" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" - }, - "node_modules/copy-to-clipboard": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", - "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", - "dependencies": { - "toggle-selection": "^1.0.6" - } - }, - "node_modules/core-js-compat": { - "version": "3.39.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.39.0.tgz", - "integrity": "sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==", - "peer": true, - "dependencies": { - "browserslist": "^4.24.2" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-js-pure": { - "version": "3.39.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.39.0.tgz", - "integrity": "sha512-7fEcWwKI4rJinnK+wLTezeg2smbFFdSBP6E2kQZNbnzM2s1rpKQ6aaRteZSSg7FLU3P0HGGVo/gbpfanU36urg==", - "dev": true, - "hasInstallScript": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/core-js" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "peer": true - }, - "node_modules/cosmiconfig": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", - "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", - "peer": true, - "dependencies": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cosmiconfig/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "peer": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/cosmiconfig/node_modules/import-fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", - "peer": true, - "dependencies": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cosmiconfig/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "peer": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/cosmiconfig/node_modules/resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "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==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "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==" - }, - "node_modules/cypress": { - "version": "13.15.1", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.15.1.tgz", - "integrity": "sha512-DwUFiKXo4lef9kA0M4iEhixFqoqp2hw8igr0lTqafRb9qtU3X0XGxKbkSYsUFdkrAkphc7MPDxoNPhk5pj9PVg==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@cypress/request": "^3.0.4", - "@cypress/xvfb": "^1.2.4", - "@types/sinonjs__fake-timers": "8.1.1", - "@types/sizzle": "^2.3.2", - "arch": "^2.2.0", - "blob-util": "^2.0.2", - "bluebird": "^3.7.2", - "buffer": "^5.7.1", - "cachedir": "^2.3.0", - "chalk": "^4.1.0", - "check-more-types": "^2.24.0", - "cli-cursor": "^3.1.0", - "cli-table3": "~0.6.1", - "commander": "^6.2.1", - "common-tags": "^1.8.0", - "dayjs": "^1.10.4", - "debug": "^4.3.4", - "enquirer": "^2.3.6", - "eventemitter2": "6.4.7", - "execa": "4.1.0", - "executable": "^4.1.1", - "extract-zip": "2.0.1", - "figures": "^3.2.0", - "fs-extra": "^9.1.0", - "getos": "^3.2.1", - "is-ci": "^3.0.1", - "is-installed-globally": "~0.4.0", - "lazy-ass": "^1.6.0", - "listr2": "^3.8.3", - "lodash": "^4.17.21", - "log-symbols": "^4.0.0", - "minimist": "^1.2.8", - "ospath": "^1.2.2", - "pretty-bytes": "^5.6.0", - "process": "^0.11.10", - "proxy-from-env": "1.0.0", - "request-progress": "^3.0.0", - "semver": "^7.5.3", - "supports-color": "^8.1.1", - "tmp": "~0.2.3", - "tree-kill": "1.2.2", - "untildify": "^4.0.0", - "yauzl": "^2.10.0" - }, - "bin": { - "cypress": "bin/cypress" - }, - "engines": { - "node": "^16.0.0 || ^18.0.0 || >=20.0.0" - } - }, - "node_modules/cypress/node_modules/bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "node_modules/cypress/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cypress/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "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/dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "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/dayjs": { - "version": "1.11.13", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", - "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==" - }, - "node_modules/debounce": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", - "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" - }, - "node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/deep-equal": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.2.tgz", - "integrity": "sha512-5tdhKF6DbU7iIzrIOa1AOUt39ZRm13cmL1cGEh//aqR8x9+tNfbywRf0n5FD/18OKMdo7DNEtrX2t22ZAkI+eg==", - "dependencies": { - "is-arguments": "^1.1.1", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.5.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "engines": { - "node": ">=4.0.0" - } - }, - "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/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-require-extensions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", - "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", - "dev": true, - "dependencies": { - "strip-bom": "^4.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "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==", - "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/delay": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", - "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/denodeify": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", - "integrity": "sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==", - "peer": true - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "peer": true, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "devOptional": true, - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/dexie": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/dexie/-/dexie-3.2.7.tgz", - "integrity": "sha512-2a+BXvVhY5op+smDRLxeBAivE7YcYaneXJ1la3HOkUfX9zKkE/AJ8CNgjiXbtXepFyFmJNGSbmjOwqbT749r/w==", - "engines": { - "node": ">=6.0" - } - }, - "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/dom-accessibility-api": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", - "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", - "dev": true - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/dompurify": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.5.7.tgz", - "integrity": "sha512-2q4bEI+coQM8f5ez7kt2xclg1XsecaV9ASJk/54vwlfRRNQfDqJz2pzQ8t0Ix/ToBpXlVjrRIx7pFC/o8itG2Q==" - }, - "node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dev": true, - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/dropbox": { - "version": "10.34.0", - "resolved": "https://registry.npmjs.org/dropbox/-/dropbox-10.34.0.tgz", - "integrity": "sha512-5jb5/XzU0fSnq36/hEpwT5/QIep7MgqKuxghEG44xCu7HruOAjPdOb3x0geXv5O/hd0nHpQpWO+r5MjYTpMvJg==", - "dependencies": { - "node-fetch": "^2.6.1" - }, - "engines": { - "node": ">=0.10.3" - }, - "peerDependencies": { - "@types/node-fetch": "^2.5.7" - } - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", - "dev": true - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" - }, - "node_modules/ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", - "dev": true, - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "peer": true - }, - "node_modules/electron-to-chromium": { - "version": "1.5.49", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.49.tgz", - "integrity": "sha512-ZXfs1Of8fDb6z7WEYZjXpgIRF6MEu8JdeGA0A40aZq6OQbS+eJpnnV49epZRna2DU/YsEjSQuGtQPPtvt6J65A==" - }, - "node_modules/emoji-mart": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/emoji-mart/-/emoji-mart-5.6.0.tgz", - "integrity": "sha512-eJp3QRe79pjwa+duv+n7+5YsNhRcMl812EcFVwrnRvYKoNPoQb5qxU8DG6Bgwji0akHdp6D4Ln6tYLG58MFSow==" - }, - "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==" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/enquirer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", - "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.1", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "peer": true, - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/error-stack-parser": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", - "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", - "peer": true, - "dependencies": { - "stackframe": "^1.3.4" - } - }, - "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==", - "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==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-iterator-helpers": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.1.0.tgz", - "integrity": "sha512-/SurEfycdyssORP/E+bj4sEu1CWw4EmLDsHynHwSXQ7utgbrMRWW195pTrCjFgFCddf/UkYm3oqKPRq5i8bJbw==", - "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.4", - "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.3", - "safe-array-concat": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-module-lexer": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", - "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", - "dev": true, - "peer": true - }, - "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/es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, - "node_modules/esbuild": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.54.tgz", - "integrity": "sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/linux-loong64": "0.14.54", - "esbuild-android-64": "0.14.54", - "esbuild-android-arm64": "0.14.54", - "esbuild-darwin-64": "0.14.54", - "esbuild-darwin-arm64": "0.14.54", - "esbuild-freebsd-64": "0.14.54", - "esbuild-freebsd-arm64": "0.14.54", - "esbuild-linux-32": "0.14.54", - "esbuild-linux-64": "0.14.54", - "esbuild-linux-arm": "0.14.54", - "esbuild-linux-arm64": "0.14.54", - "esbuild-linux-mips64le": "0.14.54", - "esbuild-linux-ppc64le": "0.14.54", - "esbuild-linux-riscv64": "0.14.54", - "esbuild-linux-s390x": "0.14.54", - "esbuild-netbsd-64": "0.14.54", - "esbuild-openbsd-64": "0.14.54", - "esbuild-sunos-64": "0.14.54", - "esbuild-windows-32": "0.14.54", - "esbuild-windows-64": "0.14.54", - "esbuild-windows-arm64": "0.14.54" - } - }, - "node_modules/esbuild-android-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz", - "integrity": "sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-android-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz", - "integrity": "sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz", - "integrity": "sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz", - "integrity": "sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz", - "integrity": "sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz", - "integrity": "sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-32": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz", - "integrity": "sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz", - "integrity": "sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz", - "integrity": "sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz", - "integrity": "sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-mips64le": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz", - "integrity": "sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-ppc64le": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz", - "integrity": "sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-riscv64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz", - "integrity": "sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-s390x": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz", - "integrity": "sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-netbsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz", - "integrity": "sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-openbsd-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz", - "integrity": "sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sunos-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz", - "integrity": "sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-32": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz", - "integrity": "sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz", - "integrity": "sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-arm64": { - "version": "0.14.54", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz", - "integrity": "sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "peer": true - }, - "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==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.23.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.23.0.tgz", - "integrity": "sha512-pBG/XOn0MsJcKcTRLr27S5HpzQo4kLr+HjLQIyK4EiCsijDl/TB+h5uEuJU6bQ8Edvwz1XWOjpaP2qgnXGpTcA==", - "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", - "dev": true, - "dependencies": { - "@eslint/eslintrc": "^1.3.1", - "@humanwhocodes/config-array": "^0.10.4", - "@humanwhocodes/gitignore-to-minimatch": "^1.0.2", - "@humanwhocodes/module-importer": "^1.0.1", - "ajv": "^6.10.0", - "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.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", - "globals": "^13.15.0", - "globby": "^11.1.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "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.1", - "regexpp": "^3.2.0", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "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-airbnb-base": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", - "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", - "dev": true, - "dependencies": { - "confusing-browser-globals": "^1.0.10", - "object.assign": "^4.1.2", - "object.entries": "^1.1.5", - "semver": "^6.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "peerDependencies": { - "eslint": "^7.32.0 || ^8.2.0", - "eslint-plugin-import": "^2.25.2" - } - }, - "node_modules/eslint-config-airbnb-typescript": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-17.1.0.tgz", - "integrity": "sha512-GPxI5URre6dDpJ0CtcthSZVBAfI+Uw7un5OYNVxP2EYi3H81Jw701yFP7AU+/vCE7xBtFmjge7kfhhk4+RAiig==", - "dev": true, - "dependencies": { - "eslint-config-airbnb-base": "^15.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^5.13.0 || ^6.0.0", - "@typescript-eslint/parser": "^5.0.0 || ^6.0.0", - "eslint": "^7.32.0 || ^8.2.0", - "eslint-plugin-import": "^2.25.3" - } - }, - "node_modules/eslint-config-next": { - "version": "13.5.7", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-13.5.7.tgz", - "integrity": "sha512-pdeUuL9KZ8qFzzKqCbxk6FXwG9dNEnot/3+qSFJqxdSGgkFUH8cgZus/meyCi2S0cTAsDbBEE030E6zvL9pUYQ==", - "dev": true, - "dependencies": { - "@next/eslint-plugin-next": "13.5.7", - "@rushstack/eslint-patch": "^1.3.3", - "@typescript-eslint/parser": "^5.4.2 || ^6.0.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-config-next/node_modules/eslint-import-resolver-typescript": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.3.tgz", - "integrity": "sha512-ud9aw4szY9cCT1EWWdGv1L1XR6hh2PaRWif0j2QjQ0pgTY/69iw+W0Z4qZv5wHahOl8isEr+k/JnyAqNQkLkIA==", - "dev": true, - "dependencies": { - "@nolyfill/is-core-module": "1.0.39", - "debug": "^4.3.5", - "enhanced-resolve": "^5.15.0", - "eslint-module-utils": "^2.8.1", - "fast-glob": "^3.3.2", - "get-tsconfig": "^4.7.5", - "is-bun-module": "^1.0.2", - "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": "*", - "eslint-plugin-import-x": "*" - }, - "peerDependenciesMeta": { - "eslint-plugin-import": { - "optional": true - }, - "eslint-plugin-import-x": { - "optional": true - } - } - }, - "node_modules/eslint-config-prettier": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", - "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "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-module-utils": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", - "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", - "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.31.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", - "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", - "dev": true, - "dependencies": { - "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.8", - "array.prototype.findlastindex": "^1.2.5", - "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.12.0", - "hasown": "^2.0.2", - "is-core-module": "^2.15.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.8", - "object.groupby": "^1.0.3", - "object.values": "^1.2.0", - "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.8", - "tsconfig-paths": "^3.15.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" - } - }, - "node_modules/eslint-plugin-import-newlines": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import-newlines/-/eslint-plugin-import-newlines-1.4.0.tgz", - "integrity": "sha512-+Cz1x2xBLtI9gJbmuYEpvY7F8K75wskBmJ7rk4VRObIJo+jklUJaejFJgtnWeL0dCFWabGEkhausrikXaNbtoQ==", - "dev": true, - "bin": { - "import-linter": "lib/index.js" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "eslint": ">=6.0.0" - } - }, - "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-jsx-a11y": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", - "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", - "dev": true, - "dependencies": { - "aria-query": "^5.3.2", - "array-includes": "^3.1.8", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "^4.10.0", - "axobject-query": "^4.1.0", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "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.1" - }, - "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" - } - }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/aria-query": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", - "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz", - "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==", - "dev": true, - "dependencies": { - "prettier-linter-helpers": "^1.0.0", - "synckit": "^0.9.1" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint-plugin-prettier" - }, - "peerDependencies": { - "@types/eslint": ">=8.0.0", - "eslint": ">=8.0.0", - "eslint-config-prettier": "*", - "prettier": ">=3.0.0" - }, - "peerDependenciesMeta": { - "@types/eslint": { - "optional": true - }, - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-react": { - "version": "7.37.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.2.tgz", - "integrity": "sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.8", - "array.prototype.findlast": "^1.2.5", - "array.prototype.flatmap": "^1.3.2", - "array.prototype.tosorted": "^1.1.4", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.1.0", - "estraverse": "^5.3.0", - "hasown": "^2.0.2", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.8", - "object.fromentries": "^2.0.8", - "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", - "string.prototype.repeat": "^1.0.0" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" - } - }, - "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-simple-import-sort": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-8.0.0.tgz", - "integrity": "sha512-bXgJQ+lqhtQBCuWY/FUWdB27j4+lqcvXv5rUARkzbeWLwea+S5eBZEQrhnO+WgX3ZoJHVj0cn943iyXwByHHQw==", - "dev": true, - "peerDependencies": { - "eslint": ">=5.0.0" - } - }, - "node_modules/eslint-plugin-sort-destructure-keys": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-sort-destructure-keys/-/eslint-plugin-sort-destructure-keys-1.6.0.tgz", - "integrity": "sha512-cdjR/+D6RlMSgOcDA48nXOF5S+fMKhVFgJs9n59PZVH7dv5xzeCReujM9Qkwcz4jiHt5GPti5wjCJpM58CMmkg==", - "dev": true, - "dependencies": { - "natural-compare-lite": "^1.4.0" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "eslint": "3 - 9" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-scope/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "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/eslint/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/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/eslint/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/eslint/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/eslint/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/eslint/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/eslint/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/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/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "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==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/eventemitter2": { - "version": "6.4.7", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz", - "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==", - "dev": true - }, - "node_modules/eventemitter3": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-2.0.3.tgz", - "integrity": "sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==" - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", - "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "signal-exit": "^3.0.2", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/executable": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", - "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", - "dev": true, - "dependencies": { - "pify": "^2.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/exponential-backoff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", - "peer": true - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", - "dev": true, - "engines": [ - "node >=0.6.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==" - }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "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==" - }, - "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/fast-uri": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", - "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", - "dev": true, - "peer": 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/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "peer": true, - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "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/file-saver": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", - "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==" - }, - "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==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "peer": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/finalhandler/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/finalhandler/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "peer": true - }, - "node_modules/find-cache-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", - "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", - "dev": true, - "peer": true, - "dependencies": { - "common-path-prefix": "^3.0.0", - "pkg-dir": "^7.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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/flow-enums-runtime": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", - "integrity": "sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==", - "peer": true - }, - "node_modules/flow-parser": { - "version": "0.251.1", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.251.1.tgz", - "integrity": "sha512-8ZuLqJPlL/T9K3zFdr1m88Lx8JOoJluTTdyvN4uH5NT9zoIIFqbCDoXVhkHh022k2lhuAyFF27cu0BYKh5SmDA==", - "peer": true, - "engines": { - "node": ">=0.4.0" - } - }, - "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": "2.0.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", - "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/form-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", - "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "dev": true, - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fromentries": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", - "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", - "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/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", - "dev": true, - "dependencies": { - "at-least-node": "^1.0.0", - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "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==" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "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==", - "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/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, - "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==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/fuse.js": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-6.6.2.tgz", - "integrity": "sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/generic-names": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-4.0.0.tgz", - "integrity": "sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==", - "dev": true, - "dependencies": { - "loader-utils": "^3.2.0" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "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==", - "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-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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.8.1", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", - "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", - "dev": true, - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/getos": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", - "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", - "dev": true, - "dependencies": { - "async": "^3.2.0" - } - }, - "node_modules/getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "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-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true, - "peer": true - }, - "node_modules/global-dirs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", - "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", - "dev": true, - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, - "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/goober": { - "version": "2.1.16", - "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.16.tgz", - "integrity": "sha512-erjk19y1U33+XAMe1VTvIONHYoSqE4iS7BYUZfHaqeohLmnC0FdxEh7rQU+6MZ4OajItzjZFSRtVANrQwNq6/g==", - "peerDependencies": { - "csstype": "^3.0.10" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "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/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "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/gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "dev": true, - "dependencies": { - "duplexer": "^0.1.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "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==", - "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==", - "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==", - "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==", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasha": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", - "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", - "dev": true, - "dependencies": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/hasha/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/header-case": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", - "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", - "dev": true, - "dependencies": { - "capital-case": "^1.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/hermes-estree": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.23.1.tgz", - "integrity": "sha512-eT5MU3f5aVhTqsfIReZ6n41X5sYn4IdQL0nvz6yO+MMlPxw49aSARHLg/MSehQftyjnrE8X6bYregzSumqc6cg==", - "peer": true - }, - "node_modules/hermes-parser": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.23.1.tgz", - "integrity": "sha512-oxl5h2DkFW83hT4DAUJorpah8ou4yvmweUzLJmmr6YV2cezduCdlil1AvU/a/xSsAFo4WUcNA4GoV5Bvq6JffA==", - "peer": true, - "dependencies": { - "hermes-estree": "0.23.1" - } - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hoist-non-react-statics/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==" - }, - "node_modules/howler": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/howler/-/howler-2.2.4.tgz", - "integrity": "sha512-iARIBPgcQrwtEr+tALF+rapJ8qSc+Set2GJQl7xT1MQzWaVkFebdJhR3alVlSiUf5U7nAANKuj3aWpwerocD5w==" - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, - "node_modules/html-parse-stringify": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", - "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", - "dependencies": { - "void-elements": "3.1.0" - } - }, - "node_modules/html-to-text": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-9.0.5.tgz", - "integrity": "sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==", - "dependencies": { - "@selderee/plugin-htmlparser2": "^0.11.0", - "deepmerge": "^4.3.1", - "dom-serializer": "^2.0.0", - "htmlparser2": "^8.0.2", - "selderee": "^0.11.0" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "peer": true, - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-signature": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.4.0.tgz", - "integrity": "sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==", - "dev": true, - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^2.0.2", - "sshpk": "^1.18.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/human-signals": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", - "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", - "dev": true, - "engines": { - "node": ">=8.12.0" - } - }, - "node_modules/i18next": { - "version": "22.5.1", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-22.5.1.tgz", - "integrity": "sha512-8TGPgM3pAD+VRsMtUMNknRz3kzqwp/gPALrWMsDnmC1mKqJwpWyooQRLMcbTwq8z8YwSmuj+ZYvc+xCuEpkssA==", - "funding": [ - { - "type": "individual", - "url": "https://locize.com" - }, - { - "type": "individual", - "url": "https://locize.com/i18next.html" - }, - { - "type": "individual", - "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" - } - ], - "dependencies": { - "@babel/runtime": "^7.20.6" - } - }, - "node_modules/i18next-browser-languagedetector": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-7.2.1.tgz", - "integrity": "sha512-h/pM34bcH6tbz8WgGXcmWauNpQupCGr25XPp9cZwZInR9XHSjIFDYp1SIok7zSPsTOMxdvuLyu86V+g2Kycnfw==", - "dependencies": { - "@babel/runtime": "^7.23.2" - } - }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "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/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/image-size": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.1.1.tgz", - "integrity": "sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==", - "peer": true, - "dependencies": { - "queue": "6.0.2" - }, - "bin": { - "image-size": "bin/image-size.js" - }, - "engines": { - "node": ">=16.x" - } - }, - "node_modules/immer": { - "version": "9.0.21", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", - "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/immer" - } - }, - "node_modules/immutable": { - "version": "3.7.6", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.7.6.tgz", - "integrity": "sha512-AizQPcaofEtO11RZhPPHBOJRdo/20MKQF9mBLnVkBoyHi1/zXK8fzVdnEpSV9gxqtnh6Qomfp3F0xT5qP/vThw==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "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/import-fresh/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/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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.", - "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==" - }, - "node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "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/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "peer": true, - "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==", - "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-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "peer": true - }, - "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==", - "dev": 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-bun-module": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-1.2.1.tgz", - "integrity": "sha512-AmidtEM6D6NmUiLOvvU7+IePxjEjOzra2h0pSrsfSAcXwl/83zLLXDByafUJy9k/rKK0pvXMLdwKwGHlX2Ke6Q==", - "dev": true, - "dependencies": { - "semver": "^7.6.3" - } - }, - "node_modules/is-bun-module/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "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-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "dev": true, - "dependencies": { - "ci-info": "^3.2.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/is-core-module": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", - "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", - "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==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-directory": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "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-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "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-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "peer": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-port-reachable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-port-reachable/-/is-port-reachable-4.0.0.tgz", - "integrity": "sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "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-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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==" - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", - "dev": true - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-hook": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", - "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", - "dev": true, - "dependencies": { - "append-transform": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", - "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", - "dependencies": { - "@babel/core": "^7.12.3", - "@babel/parser": "^7.14.7", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-processinfo": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", - "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", - "dev": true, - "dependencies": { - "archy": "^1.0.0", - "cross-spawn": "^7.0.3", - "istanbul-lib-coverage": "^3.2.0", - "p-map": "^3.0.0", - "rimraf": "^3.0.0", - "uuid": "^8.3.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-processinfo/node_modules/p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-processinfo/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report/node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/istanbul-lib-report/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/iterator.prototype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.3.tgz", - "integrity": "sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==", - "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" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/its-fine": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-1.2.5.tgz", - "integrity": "sha512-fXtDA0X0t0eBYAGLVM5YsgJGsJ5jEmqZEPrGbzdf5awjv0xE7nqv3TVnvtUF060Tkes15DbDAKW/I48vsb6SyA==", - "peer": true, - "dependencies": { - "@types/react-reconciler": "^0.28.0" - }, - "peerDependencies": { - "react": ">=18.0" - } - }, - "node_modules/its-fine/node_modules/@types/react-reconciler": { - "version": "0.28.8", - "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.8.tgz", - "integrity": "sha512-SN9c4kxXZonFhbX4hJrZy37yw9e7EIxcpHCxQv5JUS18wDE5ovkQKlqQEkufdJCCMfuI9BnjUJvhYeJ9x5Ra7g==", - "peer": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "peer": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-get-type": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", - "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", - "peer": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", - "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/graceful-fs": "^4.1.3", - "@types/node": "*", - "anymatch": "^3.0.3", - "fb-watchman": "^2.0.0", - "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "walker": "^1.0.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/jest-message-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", - "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.6.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-message-util/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "peer": true - }, - "node_modules/jest-mock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", - "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-regex-util": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", - "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", - "peer": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-util": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", - "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "peer": true, - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-validate/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "peer": true - }, - "node_modules/jest-worker": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", - "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", - "peer": true, - "dependencies": { - "@types/node": "*", - "jest-util": "^29.7.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "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/joycon": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", - "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/js-cookie": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", - "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", - "engines": { - "node": ">=14" - } - }, - "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/jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", - "dev": true - }, - "node_modules/jsc-android": { - "version": "250231.0.0", - "resolved": "https://registry.npmjs.org/jsc-android/-/jsc-android-250231.0.0.tgz", - "integrity": "sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw==", - "peer": true - }, - "node_modules/jsc-safe-url": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz", - "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==", - "peer": true - }, - "node_modules/jscodeshift": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.14.0.tgz", - "integrity": "sha512-7eCC1knD7bLUPuSCwXsMZUH51O8jIcoVyKtI6P0XM0IVzlGjckPy3FIwQlorzbN0Sg79oK+RlohN32Mqf/lrYA==", - "peer": true, - "dependencies": { - "@babel/core": "^7.13.16", - "@babel/parser": "^7.13.16", - "@babel/plugin-proposal-class-properties": "^7.13.0", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8", - "@babel/plugin-proposal-optional-chaining": "^7.13.12", - "@babel/plugin-transform-modules-commonjs": "^7.13.8", - "@babel/preset-flow": "^7.13.13", - "@babel/preset-typescript": "^7.13.0", - "@babel/register": "^7.13.16", - "babel-core": "^7.0.0-bridge.0", - "chalk": "^4.1.2", - "flow-parser": "0.*", - "graceful-fs": "^4.2.4", - "micromatch": "^4.0.4", - "neo-async": "^2.5.0", - "node-dir": "^0.1.17", - "recast": "^0.21.0", - "temp": "^0.8.4", - "write-file-atomic": "^2.3.0" - }, - "bin": { - "jscodeshift": "bin/jscodeshift.js" - }, - "peerDependencies": { - "@babel/preset-env": "^7.1.6" - } - }, - "node_modules/jscodeshift/node_modules/write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "peer": true, - "dependencies": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "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-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "peer": true - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, - "peer": true - }, - "node_modules/json-schema": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", - "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", - "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/json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsprim": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", - "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.4.0", - "verror": "1.10.0" - } - }, - "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/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/konva": { - "version": "9.3.16", - "resolved": "https://registry.npmjs.org/konva/-/konva-9.3.16.tgz", - "integrity": "sha512-qa47cefGDDHzkToGRGDsy24f/Njrz7EHP56jQ8mlDcjAPO7vkfTDeoBDIfmF7PZtpfzDdooafQmEUJMDU2F7FQ==", - "funding": [ - { - "type": "patreon", - "url": "https://www.patreon.com/lavrton" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/konva" - }, - { - "type": "github", - "url": "https://github.com/sponsors/lavrton" - } - ], - "peer": true - }, - "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/lazy-ass": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", - "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", - "dev": true, - "engines": { - "node": "> 0.8" - } - }, - "node_modules/leac": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/leac/-/leac-0.6.0.tgz", - "integrity": "sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==", - "funding": { - "url": "https://ko-fi.com/killymxi" - } - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "peer": true, - "engines": { - "node": ">=6" - } - }, - "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/lighthouse-logger": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", - "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", - "peer": true, - "dependencies": { - "debug": "^2.6.9", - "marky": "^1.2.2" - } - }, - "node_modules/lighthouse-logger/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/lighthouse-logger/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "peer": true - }, - "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/listr2": { - "version": "3.14.0", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", - "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", - "dev": true, - "dependencies": { - "cli-truncate": "^2.1.0", - "colorette": "^2.0.16", - "log-update": "^4.0.0", - "p-map": "^4.0.0", - "rfdc": "^1.3.0", - "rxjs": "^7.5.1", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "enquirer": ">= 2.3.0 < 3" - }, - "peerDependenciesMeta": { - "enquirer": { - "optional": true - } - } - }, - "node_modules/load-tsconfig": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", - "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/loader-utils": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", - "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", - "dev": true, - "engines": { - "node": ">= 12.13.0" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "dev": true - }, - "node_modules/lodash.clonedeep": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", - "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" - }, - "node_modules/lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" - }, - "node_modules/lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", - "dev": true - }, - "node_modules/lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" - }, - "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/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", - "dev": true - }, - "node_modules/lodash.throttle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==", - "peer": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/log-update/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/lucide-react": { - "version": "0.453.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.453.0.tgz", - "integrity": "sha512-kL+RGZCcJi9BvJtzg2kshO192Ddy9hv3ij+cPrVPWSRzgCWCVazoQJxOjAwgK53NomL07HB7GPHW120FimjNhQ==", - "peerDependencies": { - "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc" - } - }, - "node_modules/lz-string": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", - "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", - "dev": true, - "bin": { - "lz-string": "bin/bin.js" - } - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "peer": true, - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/marky": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.5.tgz", - "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==", - "peer": true - }, - "node_modules/memoize-one": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", - "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==", - "peer": true - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "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/metro": { - "version": "0.81.0", - "resolved": "https://registry.npmjs.org/metro/-/metro-0.81.0.tgz", - "integrity": "sha512-kzdzmpL0gKhEthZ9aOV7sTqvg6NuTxDV8SIm9pf9sO8VVEbKrQk5DNcwupOUjgPPFAuKUc2NkT0suyT62hm2xg==", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/core": "^7.25.2", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.3", - "@babel/types": "^7.25.2", - "accepts": "^1.3.7", - "chalk": "^4.0.0", - "ci-info": "^2.0.0", - "connect": "^3.6.5", - "debug": "^2.2.0", - "denodeify": "^1.2.1", - "error-stack-parser": "^2.0.6", - "flow-enums-runtime": "^0.0.6", - "graceful-fs": "^4.2.4", - "hermes-parser": "0.24.0", - "image-size": "^1.0.2", - "invariant": "^2.2.4", - "jest-worker": "^29.6.3", - "jsc-safe-url": "^0.2.2", - "lodash.throttle": "^4.1.1", - "metro-babel-transformer": "0.81.0", - "metro-cache": "0.81.0", - "metro-cache-key": "0.81.0", - "metro-config": "0.81.0", - "metro-core": "0.81.0", - "metro-file-map": "0.81.0", - "metro-resolver": "0.81.0", - "metro-runtime": "0.81.0", - "metro-source-map": "0.81.0", - "metro-symbolicate": "0.81.0", - "metro-transform-plugins": "0.81.0", - "metro-transform-worker": "0.81.0", - "mime-types": "^2.1.27", - "nullthrows": "^1.1.1", - "serialize-error": "^2.1.0", - "source-map": "^0.5.6", - "strip-ansi": "^6.0.0", - "throat": "^5.0.0", - "ws": "^7.5.10", - "yargs": "^17.6.2" - }, - "bin": { - "metro": "src/cli.js" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-babel-transformer": { - "version": "0.81.0", - "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.81.0.tgz", - "integrity": "sha512-Dc0QWK4wZIeHnyZ3sevWGTnnSkIDDn/SWyfrn99zbKbDOCoCYy71PAn9uCRrP/hduKLJQOy+tebd63Rr9D8tXg==", - "peer": true, - "dependencies": { - "@babel/core": "^7.25.2", - "flow-enums-runtime": "^0.0.6", - "hermes-parser": "0.24.0", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-babel-transformer/node_modules/hermes-estree": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.24.0.tgz", - "integrity": "sha512-LyoXLB7IFzeZW0EvAbGZacbxBN7t6KKSDqFJPo3Ydow7wDlrDjXwsdiAHV6XOdvEN9MEuWXsSIFN4tzpyrXIHw==", - "peer": true - }, - "node_modules/metro-babel-transformer/node_modules/hermes-parser": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.24.0.tgz", - "integrity": "sha512-IJooSvvu2qNRe7oo9Rb04sUT4omtZqZqf9uq9WM25Tb6v3usmvA93UqfnnoWs5V0uYjEl9Al6MNU10MCGKLwpg==", - "peer": true, - "dependencies": { - "hermes-estree": "0.24.0" - } - }, - "node_modules/metro-cache": { - "version": "0.81.0", - "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.81.0.tgz", - "integrity": "sha512-DyuqySicHXkHUDZFVJmh0ygxBSx6pCKUrTcSgb884oiscV/ROt1Vhye+x+OIHcsodyA10gzZtrVtxIFV4l9I4g==", - "peer": true, - "dependencies": { - "exponential-backoff": "^3.1.1", - "flow-enums-runtime": "^0.0.6", - "metro-core": "0.81.0" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-cache-key": { - "version": "0.81.0", - "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.81.0.tgz", - "integrity": "sha512-qX/IwtknP9bQZL78OK9xeSvLM/xlGfrs6SlUGgHvrxtmGTRSsxcyqxR+c+7ch1xr05n62Gin/O44QKg5V70rNQ==", - "peer": true, - "dependencies": { - "flow-enums-runtime": "^0.0.6" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-config": { - "version": "0.81.0", - "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.81.0.tgz", - "integrity": "sha512-6CinEaBe3WLpRlKlYXXu8r1UblJhbwD6Gtnoib5U8j6Pjp7XxMG9h/DGMeNp9aGLDu1OieUqiXpFo7O0/rR5Kg==", - "peer": true, - "dependencies": { - "connect": "^3.6.5", - "cosmiconfig": "^5.0.5", - "flow-enums-runtime": "^0.0.6", - "jest-validate": "^29.6.3", - "metro": "0.81.0", - "metro-cache": "0.81.0", - "metro-core": "0.81.0", - "metro-runtime": "0.81.0" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-core": { - "version": "0.81.0", - "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.81.0.tgz", - "integrity": "sha512-CVkM5YCOAFkNMvJai6KzA0RpztzfEKRX62/PFMOJ9J7K0uq/UkOFLxcgpcncMIrfy0PbfEj811b69tjULUQe1Q==", - "peer": true, - "dependencies": { - "flow-enums-runtime": "^0.0.6", - "lodash.throttle": "^4.1.1", - "metro-resolver": "0.81.0" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-file-map": { - "version": "0.81.0", - "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.81.0.tgz", - "integrity": "sha512-zMDI5uYhQCyxbye/AuFx/pAbsz9K+vKL7h1ShUXdN2fz4VUPiyQYRsRqOoVG1DsiCgzd5B6LW0YW77NFpjDQeg==", - "peer": true, - "dependencies": { - "anymatch": "^3.0.3", - "debug": "^2.2.0", - "fb-watchman": "^2.0.0", - "flow-enums-runtime": "^0.0.6", - "graceful-fs": "^4.2.4", - "invariant": "^2.2.4", - "jest-worker": "^29.6.3", - "micromatch": "^4.0.4", - "node-abort-controller": "^3.1.1", - "nullthrows": "^1.1.1", - "walker": "^1.0.7" - }, - "engines": { - "node": ">=18.18" - }, - "optionalDependencies": { - "fsevents": "^2.3.2" - } - }, - "node_modules/metro-file-map/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/metro-file-map/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "peer": true - }, - "node_modules/metro-minify-terser": { - "version": "0.81.0", - "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.81.0.tgz", - "integrity": "sha512-U2ramh3W822ZR1nfXgIk+emxsf5eZSg10GbQrT0ZizImK8IZ5BmJY+BHRIkQgHzWFpExOVxC7kWbGL1bZALswA==", - "peer": true, - "dependencies": { - "flow-enums-runtime": "^0.0.6", - "terser": "^5.15.0" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-resolver": { - "version": "0.81.0", - "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.81.0.tgz", - "integrity": "sha512-Uu2Q+buHhm571cEwpPek8egMbdSTqmwT/5U7ZVNpK6Z2ElQBBCxd7HmFAslKXa7wgpTO2FAn6MqGeERbAtVDUA==", - "peer": true, - "dependencies": { - "flow-enums-runtime": "^0.0.6" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-runtime": { - "version": "0.81.0", - "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.81.0.tgz", - "integrity": "sha512-6oYB5HOt37RuGz2eV4A6yhcl+PUTwJYLDlY9vhT+aVjbUWI6MdBCf69vc4f5K5Vpt+yOkjy+2LDwLS0ykWFwYw==", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.25.0", - "flow-enums-runtime": "^0.0.6" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-source-map": { - "version": "0.81.0", - "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.81.0.tgz", - "integrity": "sha512-TzsVxhH83dyxg4A4+L1nzNO12I7ps5IHLjKGZH3Hrf549eiZivkdjYiq/S5lOB+p2HiQ+Ykcwtmcja95LIC62g==", - "peer": true, - "dependencies": { - "@babel/traverse": "^7.25.3", - "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", - "@babel/types": "^7.25.2", - "flow-enums-runtime": "^0.0.6", - "invariant": "^2.2.4", - "metro-symbolicate": "0.81.0", - "nullthrows": "^1.1.1", - "ob1": "0.81.0", - "source-map": "^0.5.6", - "vlq": "^1.0.0" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-source-map/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/metro-symbolicate": { - "version": "0.81.0", - "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.81.0.tgz", - "integrity": "sha512-C/1rWbNTPYp6yzID8IPuQPpVGzJ2rbWYBATxlvQ9dfK5lVNoxcwz77hjcY8ISLsRRR15hyd/zbjCNKPKeNgE1Q==", - "peer": true, - "dependencies": { - "flow-enums-runtime": "^0.0.6", - "invariant": "^2.2.4", - "metro-source-map": "0.81.0", - "nullthrows": "^1.1.1", - "source-map": "^0.5.6", - "through2": "^2.0.1", - "vlq": "^1.0.0" - }, - "bin": { - "metro-symbolicate": "src/index.js" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-symbolicate/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/metro-transform-plugins": { - "version": "0.81.0", - "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.81.0.tgz", - "integrity": "sha512-uErLAPBvttGCrmGSCa0dNHlOTk3uJFVEVWa5WDg6tQ79PRmuYRwzUgLhVzn/9/kyr75eUX3QWXN79Jvu4txt6Q==", - "peer": true, - "dependencies": { - "@babel/core": "^7.25.2", - "@babel/generator": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.3", - "flow-enums-runtime": "^0.0.6", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro-transform-worker": { - "version": "0.81.0", - "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.81.0.tgz", - "integrity": "sha512-HrQ0twiruhKy0yA+9nK5bIe3WQXZcC66PXTvRIos61/EASLAP2DzEmW7IxN/MGsfZegN2UzqL2CG38+mOB45vg==", - "peer": true, - "dependencies": { - "@babel/core": "^7.25.2", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", - "@babel/types": "^7.25.2", - "flow-enums-runtime": "^0.0.6", - "metro": "0.81.0", - "metro-babel-transformer": "0.81.0", - "metro-cache": "0.81.0", - "metro-cache-key": "0.81.0", - "metro-minify-terser": "0.81.0", - "metro-source-map": "0.81.0", - "metro-transform-plugins": "0.81.0", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=18.18" - } - }, - "node_modules/metro/node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "peer": true - }, - "node_modules/metro/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "peer": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/metro/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/metro/node_modules/hermes-estree": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.24.0.tgz", - "integrity": "sha512-LyoXLB7IFzeZW0EvAbGZacbxBN7t6KKSDqFJPo3Ydow7wDlrDjXwsdiAHV6XOdvEN9MEuWXsSIFN4tzpyrXIHw==", - "peer": true - }, - "node_modules/metro/node_modules/hermes-parser": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.24.0.tgz", - "integrity": "sha512-IJooSvvu2qNRe7oo9Rb04sUT4omtZqZqf9uq9WM25Tb6v3usmvA93UqfnnoWs5V0uYjEl9Al6MNU10MCGKLwpg==", - "peer": true, - "dependencies": { - "hermes-estree": "0.24.0" - } - }, - "node_modules/metro/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "peer": true - }, - "node_modules/metro/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/metro/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "peer": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/metro/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/metro/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "peer": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/metro/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "peer": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "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==", - "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/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "peer": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/moment": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", - "peer": true, - "engines": { - "node": "*" - } - }, - "node_modules/mrmime": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", - "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "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/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "peer": true - }, - "node_modules/next": { - "version": "14.2.16", - "resolved": "https://registry.npmjs.org/next/-/next-14.2.16.tgz", - "integrity": "sha512-LcO7WnFu6lYSvCzZoo1dB+IO0xXz5uEv52HF1IUN0IqVTUIZGHuuR10I5efiLadGt+4oZqTcNZyVVEem/TM5nA==", - "dependencies": { - "@next/env": "14.2.16", - "@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.16", - "@next/swc-darwin-x64": "14.2.16", - "@next/swc-linux-arm64-gnu": "14.2.16", - "@next/swc-linux-arm64-musl": "14.2.16", - "@next/swc-linux-x64-gnu": "14.2.16", - "@next/swc-linux-x64-musl": "14.2.16", - "@next/swc-win32-arm64-msvc": "14.2.16", - "@next/swc-win32-ia32-msvc": "14.2.16", - "@next/swc-win32-x64-msvc": "14.2.16" - }, - "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-build-id": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/next-build-id/-/next-build-id-3.0.0.tgz", - "integrity": "sha512-B3JCsL/9Z/wkmo3EySukQHCgx89Aw0i4LPi2MEhCboQBJ6wpkYTIu1z6hOYKuw/S1Wy8ZRqCEq0dVY/ST6jGqg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/next-seo": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/next-seo/-/next-seo-5.15.0.tgz", - "integrity": "sha512-LGbcY91yDKGMb7YI+28n3g+RuChUkt6pXNpa8FkfKkEmNiJkeRDEXTnnjVtwT9FmMhG6NH8qwHTelGrlYm9rgg==", - "peerDependencies": { - "next": "^8.1.1-canary.54 || >=9.0.0", - "react": ">=16.0.0", - "react-dom": ">=16.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/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/node-abort-controller": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", - "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", - "peer": true - }, - "node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", - "devOptional": true - }, - "node_modules/node-dir": { - "version": "0.1.17", - "resolved": "https://registry.npmjs.org/node-dir/-/node-dir-0.1.17.tgz", - "integrity": "sha512-tmPX422rYgofd4epzrNoOXiE8XFZYOcCq1vD7MAXCDO+O+zndlA2ztdKKMa+EeuBG5tHETpr4ml4RGgpqDCCAg==", - "peer": true, - "dependencies": { - "minimatch": "^3.0.2" - }, - "engines": { - "node": ">= 0.10.5" - } - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "peer": true, - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "peer": true - }, - "node_modules/node-preload": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", - "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", - "dev": true, - "dependencies": { - "process-on-spawn": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/node-releases": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", - "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==" - }, - "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==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nullthrows": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", - "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", - "peer": true - }, - "node_modules/nyc": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", - "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", - "dev": true, - "dependencies": { - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "caching-transform": "^4.0.0", - "convert-source-map": "^1.7.0", - "decamelize": "^1.2.0", - "find-cache-dir": "^3.2.0", - "find-up": "^4.1.0", - "foreground-child": "^2.0.0", - "get-package-type": "^0.1.0", - "glob": "^7.1.6", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-hook": "^3.0.0", - "istanbul-lib-instrument": "^4.0.0", - "istanbul-lib-processinfo": "^2.0.2", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.0.2", - "make-dir": "^3.0.0", - "node-preload": "^0.2.1", - "p-map": "^3.0.0", - "process-on-spawn": "^1.0.0", - "resolve-from": "^5.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "spawn-wrap": "^2.0.0", - "test-exclude": "^6.0.0", - "yargs": "^15.0.2" - }, - "bin": { - "nyc": "bin/nyc.js" - }, - "engines": { - "node": ">=8.9" - } - }, - "node_modules/nyc/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "node_modules/nyc/node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" - } - }, - "node_modules/nyc/node_modules/istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", - "dev": true, - "dependencies": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/p-map": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", - "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/nyc/node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ob1": { - "version": "0.81.0", - "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.81.0.tgz", - "integrity": "sha512-6Cvrkxt1tqaRdWqTAMcVYEiO5i1xcF9y7t06nFdjFqkfPsEloCf8WwhXdwBpNUkVYSQlSGS7cDgVQR86miBfBQ==", - "peer": true, - "dependencies": { - "flow-enums-runtime": "^0.0.6" - }, - "engines": { - "node": ">=18.18" - } - }, - "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==", - "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==", - "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==", - "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.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/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "peer": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "engines": { - "node": ">= 0.8" - } - }, - "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==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "peer": true, - "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "dev": true, - "bin": { - "opener": "bin/opener-bin.js" - } - }, - "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/ospath": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", - "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==", - "dev": true - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/package-hash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", - "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.15", - "hasha": "^5.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true - }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dev": true, - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/parchment": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/parchment/-/parchment-2.0.1.tgz", - "integrity": "sha512-VBKrlEoZCBD+iwoeag0QTtY1Cti+Ma4nLpVYcc/uus/wHhMsPOi5InH3RL1s4aekahPZpabcS2ToKyGf7RMH/g==" - }, - "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/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", - "peer": true, - "dependencies": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/parseley": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/parseley/-/parseley-0.12.1.tgz", - "integrity": "sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==", - "dependencies": { - "leac": "^0.6.0", - "peberminta": "^0.9.0" - }, - "funding": { - "url": "https://ko-fi.com/killymxi" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/path-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", - "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", - "dev": true, - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "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==", - "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==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" - }, - "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==", - "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==" - }, - "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-scurry/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/path-to-regexp": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", - "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==" - }, - "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/peberminta": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/peberminta/-/peberminta-0.9.0.tgz", - "integrity": "sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==", - "funding": { - "url": "https://ko-fi.com/killymxi" - } - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true - }, - "node_modules/performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", - "dev": true - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "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==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", - "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", - "dev": true, - "peer": true, - "dependencies": { - "find-up": "^6.3.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", - "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", - "dev": true, - "peer": true, - "dependencies": { - "locate-path": "^7.1.0", - "path-exists": "^5.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", - "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", - "dev": true, - "peer": true, - "dependencies": { - "p-locate": "^6.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dev": true, - "peer": true, - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", - "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", - "dev": true, - "peer": true, - "dependencies": { - "p-limit": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "dev": true, - "peer": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/pkg-dir/node_modules/yocto-queue": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", - "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", - "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.1.0", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", - "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.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-modules": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-6.0.0.tgz", - "integrity": "sha512-7DGfnlyi/ju82BRzTIjWS5C4Tafmzl3R79YP/PASiocj+aa6yYphHhhKUOEoXQToId5rgyFgJ88+ccOUydjBXQ==", - "dev": true, - "dependencies": { - "generic-names": "^4.0.0", - "icss-utils": "^5.1.0", - "lodash.camelcase": "^4.3.0", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", - "postcss-modules-values": "^4.0.0", - "string-hash": "^1.1.1" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", - "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", - "dev": true, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", - "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", - "dev": true, - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", - "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-nested": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", - "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "postcss-selector-parser": "^6.1.1" - }, - "engines": { - "node": ">=12.0" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/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/prettier": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", - "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", - "dev": true, - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/prettier-plugin-tailwindcss": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.4.1.tgz", - "integrity": "sha512-hwn2EiJmv8M+AW4YDkbjJ6HlZCTzLyz1QlySn9sMuKV/Px0fjwldlB7tol8GzdgqtkdPtzT3iJ4UzdnYXP25Ag==", - "dev": true, - "engines": { - "node": ">=12.17.0" - }, - "peerDependencies": { - "@ianvs/prettier-plugin-sort-imports": "*", - "@prettier/plugin-pug": "*", - "@shopify/prettier-plugin-liquid": "*", - "@shufo/prettier-plugin-blade": "*", - "@trivago/prettier-plugin-sort-imports": "*", - "prettier": "^2.2 || ^3.0", - "prettier-plugin-astro": "*", - "prettier-plugin-css-order": "*", - "prettier-plugin-import-sort": "*", - "prettier-plugin-jsdoc": "*", - "prettier-plugin-marko": "*", - "prettier-plugin-organize-attributes": "*", - "prettier-plugin-organize-imports": "*", - "prettier-plugin-style-order": "*", - "prettier-plugin-svelte": "*", - "prettier-plugin-twig-melody": "*" - }, - "peerDependenciesMeta": { - "@ianvs/prettier-plugin-sort-imports": { - "optional": true - }, - "@prettier/plugin-pug": { - "optional": true - }, - "@shopify/prettier-plugin-liquid": { - "optional": true - }, - "@shufo/prettier-plugin-blade": { - "optional": true - }, - "@trivago/prettier-plugin-sort-imports": { - "optional": true - }, - "prettier-plugin-astro": { - "optional": true - }, - "prettier-plugin-css-order": { - "optional": true - }, - "prettier-plugin-import-sort": { - "optional": true - }, - "prettier-plugin-jsdoc": { - "optional": true - }, - "prettier-plugin-marko": { - "optional": true - }, - "prettier-plugin-organize-attributes": { - "optional": true - }, - "prettier-plugin-organize-imports": { - "optional": true - }, - "prettier-plugin-style-order": { - "optional": true - }, - "prettier-plugin-svelte": { - "optional": true - }, - "prettier-plugin-twig-melody": { - "optional": true - } - } - }, - "node_modules/pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "peer": true - }, - "node_modules/process-on-spawn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", - "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", - "dev": true, - "dependencies": { - "fromentries": "^1.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/promise": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", - "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", - "peer": true, - "dependencies": { - "asap": "~2.0.6" - } - }, - "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==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/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==" - }, - "node_modules/proxy-from-env": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", - "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==", - "dev": true - }, - "node_modules/pump": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", - "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.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==", - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/queue": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", - "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", - "peer": true, - "dependencies": { - "inherits": "~2.0.3" - } - }, - "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/quill": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/quill/-/quill-1.3.7.tgz", - "integrity": "sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==", - "dependencies": { - "clone": "^2.1.1", - "deep-equal": "^1.0.1", - "eventemitter3": "^2.0.3", - "extend": "^3.0.2", - "parchment": "^1.1.4", - "quill-delta": "^3.6.2" - } - }, - "node_modules/quill-auto-detect-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/quill-auto-detect-url/-/quill-auto-detect-url-0.2.1.tgz", - "integrity": "sha512-x89cAQT+z5HLGGb+Bno09lIBVpxFM+oaBTLOZ3Z0ObV69JeVLR7KSptibp7Mez1Y4qbe8NkOyUBzb1NTiRBLpA==", - "dependencies": { - "normalize-url": "^4.5.0", - "quill-delta": "^4.2.2" - } - }, - "node_modules/quill-auto-detect-url/node_modules/fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==" - }, - "node_modules/quill-auto-detect-url/node_modules/quill-delta": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-4.2.2.tgz", - "integrity": "sha512-qjbn82b/yJzOjstBgkhtBjN2TNK+ZHP/BgUQO+j6bRhWQQdmj2lH6hXG7+nwwLF41Xgn//7/83lxs9n2BkTtTg==", - "dependencies": { - "fast-diff": "1.2.0", - "lodash.clonedeep": "^4.5.0", - "lodash.isequal": "^4.5.0" - } - }, - "node_modules/quill-delta": { - "version": "3.6.3", - "resolved": "https://registry.npmjs.org/quill-delta/-/quill-delta-3.6.3.tgz", - "integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==", - "dependencies": { - "deep-equal": "^1.0.1", - "extend": "^3.0.2", - "fast-diff": "1.1.2" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/quill-delta/node_modules/fast-diff": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz", - "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==" - }, - "node_modules/quill-mention": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/quill-mention/-/quill-mention-3.4.1.tgz", - "integrity": "sha512-7/KyWGDbh3T2pw/kPNhXrsUkc1j2Kp9mxtK7QqmU84A6oHIlcjCubsFntHQYPwX/xoJnjyzcWiBrig8vEgW0AA==", - "dependencies": { - "quill": "^1.3.7" - } - }, - "node_modules/quill/node_modules/parchment": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/parchment/-/parchment-1.1.4.tgz", - "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==" - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "peer": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-devtools-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-5.3.2.tgz", - "integrity": "sha512-crr9HkVrDiJ0A4zot89oS0Cgv0Oa4OG1Em4jit3P3ZxZSKPMYyMjfwMqgcJna9o625g8oN87rBm8SWWrSTBZxg==", - "peer": true, - "dependencies": { - "shell-quote": "^1.6.1", - "ws": "^7" - } - }, - "node_modules/react-devtools-core/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "peer": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "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-error-boundary": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-3.1.4.tgz", - "integrity": "sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==", - "dependencies": { - "@babel/runtime": "^7.12.5" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - }, - "peerDependencies": { - "react": ">=16.13.1" - } - }, - "node_modules/react-hot-toast": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/react-hot-toast/-/react-hot-toast-2.4.1.tgz", - "integrity": "sha512-j8z+cQbWIM5LY37pR6uZR6D4LfseplqnuAO4co4u8917hBUvXlEqyP1ZzqVLcqoyUesZZv/ImreoCeHVDpE5pQ==", - "dependencies": { - "goober": "^2.1.10" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "react": ">=16", - "react-dom": ">=16" - } - }, - "node_modules/react-i18next": { - "version": "12.3.1", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-12.3.1.tgz", - "integrity": "sha512-5v8E2XjZDFzK7K87eSwC7AJcAkcLt5xYZ4+yTPDAW1i7C93oOY1dnr4BaQM7un4Hm+GmghuiPvevWwlca5PwDA==", - "dependencies": { - "@babel/runtime": "^7.20.6", - "html-parse-stringify": "^3.0.1" - }, - "peerDependencies": { - "i18next": ">= 19.0.0", - "react": ">= 16.8.0" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - } - } - }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true - }, - "node_modules/react-konva": { - "version": "18.2.10", - "resolved": "https://registry.npmjs.org/react-konva/-/react-konva-18.2.10.tgz", - "integrity": "sha512-ohcX1BJINL43m4ynjZ24MxFI1syjBdrXhqVxYVDw2rKgr3yuS0x/6m1Y2Z4sl4T/gKhfreBx8KHisd0XC6OT1g==", - "funding": [ - { - "type": "patreon", - "url": "https://www.patreon.com/lavrton" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/konva" - }, - { - "type": "github", - "url": "https://github.com/sponsors/lavrton" - } - ], - "peer": true, - "dependencies": { - "@types/react-reconciler": "^0.28.2", - "its-fine": "^1.1.1", - "react-reconciler": "~0.29.0", - "scheduler": "^0.23.0" - }, - "peerDependencies": { - "konva": "^8.0.1 || ^7.2.5 || ^9.0.0", - "react": ">=18.0.0", - "react-dom": ">=18.0.0" - } - }, - "node_modules/react-konva/node_modules/@types/react-reconciler": { - "version": "0.28.8", - "resolved": "https://registry.npmjs.org/@types/react-reconciler/-/react-reconciler-0.28.8.tgz", - "integrity": "sha512-SN9c4kxXZonFhbX4hJrZy37yw9e7EIxcpHCxQv5JUS18wDE5ovkQKlqQEkufdJCCMfuI9BnjUJvhYeJ9x5Ra7g==", - "peer": true, - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/react-konva/node_modules/react-reconciler": { - "version": "0.29.2", - "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.29.2.tgz", - "integrity": "sha512-zZQqIiYgDCTP/f1N/mAR10nJGrPD2ZR+jDSEsKWJHYC7Cm2wodlwbR3upZRdC3cjIjSlTLNVyO7Iu0Yy7t2AYg==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-moment": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/react-moment/-/react-moment-1.1.3.tgz", - "integrity": "sha512-8EPvlUL8u6EknPp1ISF5MQ3wx2OHJVXIP/iZc4wRh3iV3XozftZERDv9ANZeAtMlhNNQHdFoqcZHFUkBSTONfA==", - "peerDependencies": { - "moment": "^2.29.0", - "prop-types": "^15.7.0", - "react": "^16.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-multiline-clamp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/react-multiline-clamp/-/react-multiline-clamp-2.0.0.tgz", - "integrity": "sha512-iPm3HxFD6LO63lE5ZnThiqs+6A3c+LW3WbsEM0oa0iNTa0qN4SKx/LK/6ZToSmXundEcQXBFVNzKDvgmExawTw==", - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/react-native": { - "version": "0.76.1", - "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.76.1.tgz", - "integrity": "sha512-z4KnbrnnAvloRs9NGnah3u6/LK3IbtNMrvByxa3ifigbMlsMY4WPRYV9lvt/hH4Mzt8bfuI+utnOxFyJTTq3lg==", - "peer": true, - "dependencies": { - "@jest/create-cache-key-function": "^29.6.3", - "@react-native/assets-registry": "0.76.1", - "@react-native/codegen": "0.76.1", - "@react-native/community-cli-plugin": "0.76.1", - "@react-native/gradle-plugin": "0.76.1", - "@react-native/js-polyfills": "0.76.1", - "@react-native/normalize-colors": "0.76.1", - "@react-native/virtualized-lists": "0.76.1", - "abort-controller": "^3.0.0", - "anser": "^1.4.9", - "ansi-regex": "^5.0.0", - "babel-jest": "^29.7.0", - "babel-plugin-syntax-hermes-parser": "^0.23.1", - "base64-js": "^1.5.1", - "chalk": "^4.0.0", - "commander": "^12.0.0", - "event-target-shim": "^5.0.1", - "flow-enums-runtime": "^0.0.6", - "glob": "^7.1.1", - "invariant": "^2.2.4", - "jest-environment-node": "^29.6.3", - "jsc-android": "^250231.0.0", - "memoize-one": "^5.0.0", - "metro-runtime": "^0.81.0", - "metro-source-map": "^0.81.0", - "mkdirp": "^0.5.1", - "nullthrows": "^1.1.1", - "pretty-format": "^29.7.0", - "promise": "^8.3.0", - "react-devtools-core": "^5.3.1", - "react-refresh": "^0.14.0", - "regenerator-runtime": "^0.13.2", - "scheduler": "0.24.0-canary-efb381bbf-20230505", - "semver": "^7.1.3", - "stacktrace-parser": "^0.1.10", - "whatwg-fetch": "^3.0.0", - "ws": "^6.2.3", - "yargs": "^17.6.2" - }, - "bin": { - "react-native": "cli.js" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/react": "^18.2.6", - "react": "^18.2.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-native/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/react-native/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "peer": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/react-native/node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "peer": true, - "engines": { - "node": ">=18" - } - }, - "node_modules/react-native/node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", - "peer": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/react-native/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "peer": true - }, - "node_modules/react-native/node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "peer": true - }, - "node_modules/react-native/node_modules/scheduler": { - "version": "0.24.0-canary-efb381bbf-20230505", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.24.0-canary-efb381bbf-20230505.tgz", - "integrity": "sha512-ABvovCDe/k9IluqSh4/ISoq8tIJnW8euVAWYt5j/bg6dRnqwQwiGO1F/V4AyK96NGF/FB04FhOUDuWj8IKfABA==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/react-native/node_modules/semver": { - "version": "7.6.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", - "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "peer": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/react-native/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "peer": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/react-native/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "peer": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/react-native/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/react-quill": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/react-quill/-/react-quill-2.0.0.tgz", - "integrity": "sha512-4qQtv1FtCfLgoD3PXAur5RyxuUbPXQGOHgTlFie3jtxp43mXDtzCKaOgQ3mLyZfi1PUlyjycfivKelFhy13QUg==", - "dependencies": { - "@types/quill": "^1.3.10", - "lodash": "^4.17.4", - "quill": "^1.3.7" - }, - "peerDependencies": { - "react": "^16 || ^17 || ^18", - "react-dom": "^16 || ^17 || ^18" - } - }, - "node_modules/react-reconciler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.27.0.tgz", - "integrity": "sha512-HmMDKciQjYmBRGuuhIaKA1ba/7a+UsM5FzOZsMO2JYHt9Jh8reCb7j1eDC95NOyUlKM9KRyvdx0flBuDvYSBoA==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.21.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "peerDependencies": { - "react": "^18.0.0" - } - }, - "node_modules/react-reconciler/node_modules/scheduler": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz", - "integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==", - "peer": true, - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/react-redux": { - "version": "8.1.3", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.1.3.tgz", - "integrity": "sha512-n0ZrutD7DaX/j9VscF+uTALI3oUPa/pO4Z3soOBIjuRn/FzVu6aehhysxZCLi6y7duMf52WNZGMl7CtuK5EnRw==", - "dependencies": { - "@babel/runtime": "^7.12.1", - "@types/hoist-non-react-statics": "^3.3.1", - "@types/use-sync-external-store": "^0.0.3", - "hoist-non-react-statics": "^3.3.2", - "react-is": "^18.0.0", - "use-sync-external-store": "^1.0.0" - }, - "peerDependencies": { - "@types/react": "^16.8 || ^17.0 || ^18.0", - "@types/react-dom": "^16.8 || ^17.0 || ^18.0", - "react": "^16.8 || ^17.0 || ^18.0", - "react-dom": "^16.8 || ^17.0 || ^18.0", - "react-native": ">=0.59", - "redux": "^4 || ^5.0.0-beta.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - }, - "react-dom": { - "optional": true - }, - "react-native": { - "optional": true - }, - "redux": { - "optional": true - } - } - }, - "node_modules/react-redux/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==" - }, - "node_modules/react-refresh": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", - "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-spring": { - "version": "9.7.4", - "resolved": "https://registry.npmjs.org/react-spring/-/react-spring-9.7.4.tgz", - "integrity": "sha512-ypxdsOwmCfbDZGTBRyBo7eLjF55xNFN86e/QkflZ1Rfo8QMzVjCAWocrEEbsuFKkQAg2RRdhNkinWJ6BpCvJoQ==", - "dependencies": { - "@react-spring/core": "~9.7.4", - "@react-spring/konva": "~9.7.4", - "@react-spring/native": "~9.7.4", - "@react-spring/three": "~9.7.4", - "@react-spring/web": "~9.7.4", - "@react-spring/zdog": "~9.7.4" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/react-tailwindcss-select": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/react-tailwindcss-select/-/react-tailwindcss-select-1.8.5.tgz", - "integrity": "sha512-x29IrLiqBT5FnkC9oFQReOr05tEOZHtDtZdha84nlSWcj3qD67yonKFHXIf69yc8ElFlKUxCEv0zCllN8jHBFA==", - "peerDependencies": { - "react": "^18.2.0" - } - }, - "node_modules/react-tooltip": { - "version": "5.28.0", - "resolved": "https://registry.npmjs.org/react-tooltip/-/react-tooltip-5.28.0.tgz", - "integrity": "sha512-R5cO3JPPXk6FRbBHMO0rI9nkUG/JKfalBSQfZedZYzmqaZQgq7GLzF8vcCWx6IhUCKg0yPqJhXIzmIO5ff15xg==", - "dependencies": { - "@floating-ui/dom": "^1.6.1", - "classnames": "^2.3.0" - }, - "peerDependencies": { - "react": ">=16.14.0", - "react-dom": ">=16.14.0" - } - }, - "node_modules/react-use-measure": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/react-use-measure/-/react-use-measure-2.1.1.tgz", - "integrity": "sha512-nocZhN26cproIiIduswYpV5y5lQpSQS1y/4KuvUCjSKmw7ZWIS/+g3aFnX3WdBkyuGUtTLif3UTqnLLhbDoQig==", - "dependencies": { - "debounce": "^1.2.1" - }, - "peerDependencies": { - "react": ">=16.13", - "react-dom": ">=16.13" - } - }, - "node_modules/react-zdog": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/react-zdog/-/react-zdog-1.2.2.tgz", - "integrity": "sha512-Ix7ALha91aOEwiHuxumCeYbARS5XNpc/w0v145oGkM6poF/CvhKJwzLhM5sEZbtrghMA+psAhOJkCTzJoseicA==", - "peer": true, - "dependencies": { - "react": "^18.2.0", - "react-dom": "^18.2.0", - "resize-observer-polyfill": "^1.5.1" - } - }, - "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/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "peer": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readable-stream/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "peer": true - }, - "node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "peer": true - }, - "node_modules/readdirp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", - "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", - "devOptional": true, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/readline": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz", - "integrity": "sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==", - "peer": true - }, - "node_modules/recast": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.21.5.tgz", - "integrity": "sha512-hjMmLaUXAm1hIuTqOdeYObMslq/q+Xff6QE3Y2P+uoHAg2nmVlLBps2hzh1UJDdMtDTMXOFewK6ky51JQIeECg==", - "peer": true, - "dependencies": { - "ast-types": "0.15.2", - "esprima": "~4.0.0", - "source-map": "~0.6.1", - "tslib": "^2.0.1" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/redux": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", - "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", - "dependencies": { - "@babel/runtime": "^7.9.2" - } - }, - "node_modules/redux-localstorage": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/redux-localstorage/-/redux-localstorage-0.4.1.tgz", - "integrity": "sha512-dUha0YoH+BSZ2q15pakB+JWeqiuXUf3Ir4rObOpNrZ96HEdciGAjkL10k3KGdLI7qvQw/c096asw/SQ6TPjU/A==" - }, - "node_modules/redux-thunk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", - "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==", - "peerDependencies": { - "redux": "^4" - } - }, - "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/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "peer": true - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", - "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", - "peer": true, - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" - }, - "node_modules/regenerator-transform": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", - "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", - "peer": true, - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", - "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/regexpu-core": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.1.1.tgz", - "integrity": "sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==", - "peer": true, - "dependencies": { - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.2.0", - "regjsgen": "^0.8.0", - "regjsparser": "^0.11.0", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/registry-auth-token": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", - "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", - "dependencies": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/registry-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==", - "dependencies": { - "rc": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", - "peer": true - }, - "node_modules/regjsparser": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.11.2.tgz", - "integrity": "sha512-3OGZZ4HoLJkkAZx/48mTXJNlmqTGOzc0o9OWQPuWpkOlXXPbyN6OafCcoXUnBqE2D3f/T5L+pWc1kdEmnfnRsA==", - "peer": true, - "dependencies": { - "jsesc": "~3.0.2" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", - "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", - "dev": true, - "dependencies": { - "es6-error": "^4.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/request-progress": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", - "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==", - "dev": true, - "dependencies": { - "throttleit": "^1.0.0" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "node_modules/reselect": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz", - "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==" - }, - "node_modules/reserved-words": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/reserved-words/-/reserved-words-0.1.2.tgz", - "integrity": "sha512-0S5SrIUJ9LfpbVl4Yzij6VipUdafHrOTzvmfazSw/jeZrZtQK303OPZW+obtkaw7jQlTQppy0UvZWm9872PbRw==", - "dev": true - }, - "node_modules/resize-observer-polyfill": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", - "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", - "peer": true - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "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": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "engines": { - "node": ">=8" - } - }, - "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/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "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/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", - "dev": true - }, - "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", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "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/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, - "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-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "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/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/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/sass": { - "version": "1.80.5", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.80.5.tgz", - "integrity": "sha512-TQd2aoQl/+zsxRMEDSxVdpPIqeq9UFc6pr7PzkugiTx3VYCFPUaa3P4RrBQsqok4PO200Vkz0vXQBNlg7W907g==", - "devOptional": true, - "dependencies": { - "@parcel/watcher": "^2.4.1", - "chokidar": "^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/sass/node_modules/immutable": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", - "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", - "devOptional": true - }, - "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/schema-utils": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", - "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", - "dev": true, - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 12.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/schema-utils/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "dev": true, - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/schema-utils/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/schema-utils/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "peer": true - }, - "node_modules/selderee": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/selderee/-/selderee-0.11.0.tgz", - "integrity": "sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==", - "dependencies": { - "parseley": "^0.12.0" - }, - "funding": { - "url": "https://ko-fi.com/killymxi" - } - }, - "node_modules/selfsigned": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", - "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", - "peer": true, - "dependencies": { - "@types/node-forge": "^1.3.0", - "node-forge": "^1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "peer": true, - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "peer": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "peer": true - }, - "node_modules/send/node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "peer": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/send/node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/send/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/sentence-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", - "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", - "dev": true, - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case-first": "^2.0.2" - } - }, - "node_modules/serialize-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", - "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "peer": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve": { - "version": "14.2.4", - "resolved": "https://registry.npmjs.org/serve/-/serve-14.2.4.tgz", - "integrity": "sha512-qy1S34PJ/fcY8gjVGszDB3EXiPSk5FKhUa7tQe0UPRddxRidc2V6cNHPNewbE1D7MAkgLuWEt3Vw56vYy73tzQ==", - "dependencies": { - "@zeit/schemas": "2.36.0", - "ajv": "8.12.0", - "arg": "5.0.2", - "boxen": "7.0.0", - "chalk": "5.0.1", - "chalk-template": "0.4.0", - "clipboardy": "3.0.0", - "compression": "1.7.4", - "is-port-reachable": "4.0.0", - "serve-handler": "6.1.6", - "update-check": "1.5.4" - }, - "bin": { - "serve": "build/main.js" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/serve-handler": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.6.tgz", - "integrity": "sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==", - "dependencies": { - "bytes": "3.0.0", - "content-disposition": "0.5.2", - "mime-types": "2.1.18", - "minimatch": "3.1.2", - "path-is-inside": "1.0.2", - "path-to-regexp": "3.3.0", - "range-parser": "1.2.0" - } - }, - "node_modules/serve-handler/node_modules/mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-handler/node_modules/mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", - "dependencies": { - "mime-db": "~1.33.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "peer": true, - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/serve-static/node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/serve/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/serve/node_modules/chalk": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.0.1.tgz", - "integrity": "sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/serve/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "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==", - "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==", - "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/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "peer": true - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "peer": true, - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "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==", - "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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "peer": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/sirv": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", - "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", - "dev": true, - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/snake-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", - "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", - "dev": true, - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "peer": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/spawn-wrap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", - "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", - "dev": true, - "dependencies": { - "foreground-child": "^2.0.0", - "is-windows": "^1.0.2", - "make-dir": "^3.0.0", - "rimraf": "^3.0.0", - "signal-exit": "^3.0.2", - "which": "^2.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" - }, - "node_modules/sshpk": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", - "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", - "dev": true, - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "peer": true, - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/stackframe": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", - "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", - "peer": true - }, - "node_modules/stacktrace-parser": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", - "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", - "peer": true, - "dependencies": { - "type-fest": "^0.7.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/stacktrace-parser/node_modules/type-fest": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", - "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "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_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "peer": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "peer": true - }, - "node_modules/string-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", - "integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==", - "dev": true - }, - "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==", - "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": { - "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/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==" - }, - "node_modules/string.prototype.includes": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", - "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "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.repeat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", - "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - } - }, - "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==", - "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": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "engines": { - "node": ">=6" - } - }, - "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/sucrase/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/sucrase/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/sucrase/node_modules/foreground-child": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", - "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", - "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/sucrase/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sucrase/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/sucrase/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/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==", - "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==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/suspend-react": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/suspend-react/-/suspend-react-0.1.3.tgz", - "integrity": "sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ==", - "peer": true, - "peerDependencies": { - "react": ">=17.0" - } - }, - "node_modules/synckit": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", - "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", - "dev": true, - "dependencies": { - "@pkgr/core": "^0.1.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/unts" - } - }, - "node_modules/tailwindcss": { - "version": "3.4.14", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.14.tgz", - "integrity": "sha512-IcSvOcTRcUtQQ7ILQL5quRDg7Xs93PdJEk1ZLbhhvJc7uj/OAhYOnruEiwnGgBvUtaUAJ8/mhSw1o8L2jCiENA==", - "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/tailwindcss/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/tailwindcss/node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/tailwindcss/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/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/temp": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz", - "integrity": "sha512-s0ZZzd0BzYv5tLSptZooSjK8oj6C+c19p7Vqta9+6NPOf7r+fxq0cJe6/oN4LTC79sy5NY8ucOJNgwsKCSbfqg==", - "peer": true, - "dependencies": { - "rimraf": "~2.6.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/temp/node_modules/rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "peer": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/terser": { - "version": "5.36.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.36.0.tgz", - "integrity": "sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==", - "peer": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/terser-webpack-plugin/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "peer": true - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "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/three": { - "version": "0.170.0", - "resolved": "https://registry.npmjs.org/three/-/three-0.170.0.tgz", - "integrity": "sha512-FQK+LEpYc0fBD+J8g6oSEyyNzjp+Q7Ks1C568WWaoMRLW+TkNNWmenWeGgJjV105Gd+p/2ql1ZcjYvNiPZBhuQ==", - "peer": true - }, - "node_modules/throat": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", - "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", - "peer": true - }, - "node_modules/throttleit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.1.tgz", - "integrity": "sha512-vDZpf9Chs9mAdfY046mcPt8fg5QSZr37hEH4TXYBnDF+izxgrbRGUAAaBvIk/fJm9aOFCGFd1EsNg5AZCbnQCQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, - "node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "peer": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/tldts": { - "version": "6.1.57", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.57.tgz", - "integrity": "sha512-Oy7yDXK8meJl8vPMOldzA+MtueAJ5BrH4l4HXwZuj2AtfoQbLjmTJmjNWPUcAo+E/ibHn7QlqMS0BOcXJFJyHQ==", - "dev": true, - "dependencies": { - "tldts-core": "^6.1.57" - }, - "bin": { - "tldts": "bin/cli.js" - } - }, - "node_modules/tldts-core": { - "version": "6.1.57", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.57.tgz", - "integrity": "sha512-lXnRhuQpx3zU9EONF9F7HfcRLvN1uRYUBIiKL+C/gehC/77XTU+Jye6ui86GA3rU6FjlJ0triD1Tkjt2F/2lEg==", - "dev": true - }, - "node_modules/tmp": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", - "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", - "dev": true, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "peer": true - }, - "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==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toggle-selection": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", - "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "peer": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.0.0.tgz", - "integrity": "sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==", - "dev": true, - "dependencies": { - "tldts": "^6.1.32" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "dev": true, - "bin": { - "tree-kill": "cli.js" - } - }, - "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/ts.data.json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ts.data.json/-/ts.data.json-2.2.0.tgz", - "integrity": "sha512-o3KFLCUw5v2Z7URDnGpk9iWlE9vdRv7hi2ZddEQLDdID3ufATKCB9HDJLBAs24JW3YODeVPHE/DJARIry+OZpQ==" - }, - "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/tsconfig-paths/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/tsconfig-paths/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/tslib": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", - "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", - "dev": true - }, - "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-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "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/typed-scss-modules": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/typed-scss-modules/-/typed-scss-modules-8.0.1.tgz", - "integrity": "sha512-sH+Bh179X3aTsorQXIihgw5zXtyaq86BlDIOM66DQvYv0B31oVb3Zbii8l6JdrEUbvTZjsOsOgOT4EyCKmfFNg==", - "dev": true, - "dependencies": { - "bundle-require": "^3.0.4", - "chalk": "4.1.2", - "change-case": "^4.1.2", - "chokidar": "^3.5.3", - "esbuild": "^0.14.21", - "glob": "^7.2.0", - "joycon": "^3.1.1", - "postcss": "^8.4.27", - "postcss-modules": "^6.0.0", - "reserved-words": "^0.1.2", - "slash": "^3.0.0", - "yargs": "^17.3.1" - }, - "bin": { - "typed-scss-modules": "dist/lib/cli.js" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "node-sass": "^7.0.3 || ^8.0.0", - "sass": "^1.49.7" - }, - "peerDependenciesMeta": { - "node-sass": { - "optional": true - }, - "sass": { - "optional": true - } - } - }, - "node_modules/typed-scss-modules/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/typed-scss-modules/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/typed-scss-modules/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/typed-scss-modules/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/typed-scss-modules/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/typed-scss-modules/node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/typed-scss-modules/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/typed-scss-modules/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/typescript": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.2.tgz", - "integrity": "sha512-C0I1UsrrDHo2fYI5oaCGbSejwX4ch+9Y5jTQELvovfmFkK3HHSZJB8MSJcWLmCUBzQBchCrZ9rMRV6GuNrvGtw==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "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/unicode-canonical-property-names-ecmascript": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", - "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "peer": true, - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", - "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "peer": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/update-check": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/update-check/-/update-check-1.5.4.tgz", - "integrity": "sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==", - "dependencies": { - "registry-auth-token": "3.3.2", - "registry-url": "3.1.0" - } - }, - "node_modules/upper-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", - "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", - "dev": true, - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/upper-case-first": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", - "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", - "dev": true, - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/use-sound": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/use-sound/-/use-sound-4.0.3.tgz", - "integrity": "sha512-L205pEUFIrLsGYsCUKHQVCt0ajs//YQOFbEQeNwaWaqQj3y3st4SuR+rvpMHLmv8hgTcfUFlvMQawZNI3OE18w==", - "dependencies": { - "howler": "^2.1.3" - }, - "peerDependencies": { - "react": ">=16.8" - } - }, - "node_modules/use-sync-external-store": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/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/usehooks-ts": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/usehooks-ts/-/usehooks-ts-2.16.0.tgz", - "integrity": "sha512-bez95WqYujxp6hFdM/CpRDiVPirZPxlMzOH2QB8yopoKQMXpscyZoxOjpEdaxvV+CAWUDSM62cWnqHE0E/MZ7w==", - "dependencies": { - "lodash.debounce": "^4.0.8" - }, - "engines": { - "node": ">=16.15.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17 || ^18" - } - }, - "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==" - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "peer": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/verror/node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", - "dev": true - }, - "node_modules/vlq": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", - "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", - "peer": true - }, - "node_modules/void-elements": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", - "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "peer": true, - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/watchpack": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", - "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", - "dev": true, - "peer": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/webpack": { - "version": "5.95.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.95.0.tgz", - "integrity": "sha512-2t3XstrKULz41MNMBF+cJ97TyHdyQ8HCt//pqErqDvNjU9YQBnZxIHa11VXsi7F3mb5/aO2tuDxdeTPdU7xu9Q==", - "dev": true, - "peer": true, - "dependencies": { - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.12.1", - "@webassemblyjs/wasm-edit": "^1.12.1", - "@webassemblyjs/wasm-parser": "^1.12.1", - "acorn": "^8.7.1", - "acorn-import-attributes": "^1.9.5", - "browserslist": "^4.21.10", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-bundle-analyzer": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.1.tgz", - "integrity": "sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ==", - "dev": true, - "dependencies": { - "@discoveryjs/json-ext": "0.5.7", - "acorn": "^8.0.4", - "acorn-walk": "^8.0.0", - "commander": "^7.2.0", - "debounce": "^1.2.1", - "escape-string-regexp": "^4.0.0", - "gzip-size": "^6.0.0", - "html-escaper": "^2.0.2", - "is-plain-object": "^5.0.0", - "opener": "^1.5.2", - "picocolors": "^1.0.0", - "sirv": "^2.0.3", - "ws": "^7.3.1" - }, - "bin": { - "webpack-bundle-analyzer": "lib/bin/analyzer.js" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/webpack-bundle-analyzer/node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "dev": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/whatwg-fetch": { - "version": "3.6.20", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", - "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", - "peer": true - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "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.4", - "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz", - "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==", - "dev": true, - "dependencies": { - "function.prototype.name": "^1.1.6", - "has-tostringtag": "^1.0.2", - "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.2", - "which-typed-array": "^1.1.15" - }, - "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-module": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", - "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", - "dev": true - }, - "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/widest-line": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", - "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", - "dependencies": { - "string-width": "^5.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/widest-line/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/widest-line/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==", - "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/widest-line/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==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "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": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "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": { - "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/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/ws": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", - "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", - "peer": true, - "dependencies": { - "async-limiter": "~1.0.0" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "peer": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/xxdk-wasm": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/xxdk-wasm/-/xxdk-wasm-0.3.22.tgz", - "integrity": "sha512-cJw/mGdwx60PTJtlk+ZdN4b3WB9ZA/v6sL7I9GMiukUOxqQ4RTCrA0NgmGkmCPaalpj9h+dd/aqD6e56v6KXMQ==", - "dependencies": { - "ts.data.json": "^2.2.0" - } - }, - "node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "node_modules/yaml": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.0.tgz", - "integrity": "sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==", - "dev": true, - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dev": true, - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "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/zdog": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/zdog/-/zdog-1.1.3.tgz", - "integrity": "sha512-raRj6r0gPzopFm5XWBJZr/NuV4EEnT4iE+U3dp5FV5pCb588Gmm3zLIp/j9yqqcMiHH8VNQlerLTgOqL7krh6w==", - "peer": true - }, - "node_modules/zustand": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-3.7.2.tgz", - "integrity": "sha512-PIJDIZKtokhof+9+60cpockVOq05sJzHCriyvaLBmEJixseQ1a5Kdov6fWZfWOu5SK9c+FhH1jU0tntLxRJYMA==", - "peer": true, - "engines": { - "node": ">=12.7.0" - }, - "peerDependencies": { - "react": ">=16.8" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - } - } - } - } -} diff --git a/package.json b/package.json index f45bb99790064e0ba39529002a1634f0e4d1ae6e..c4f3e6f1852bced211fdd306406c3e55da34a941 100644 --- a/package.json +++ b/package.json @@ -1,42 +1,39 @@ { "name": "haven-web", - "version": "0.3.22", + "version": "0.4.0", "private": true, + "type": "module", "scripts": { - "dev": "next dev", + "dev": "vite", "dev:ts": "yarn dev & yarn ts:watch", "ts": "tsc --noEmit --incremental", "ts:watch": "yarn ts --watch", - "build": "next build", - "build:analyze": "ANALYZE=true next build", - "start": "npx serve out", - "lint": "next lint", + "build": "tsc && vite build", + "preview": "vite preview", + "lint": "eslint", "format": "prettier --write \"**/*.{ts,tsx,md}\"", - "lint:fix": "next lint --fix", + "lint:fix": "eslint --fix", "test": "cypress", "see-cy-coverage": "open ./cypress-coverage/lcov-report/index.html" }, "dependencies": { "@emoji-mart/data": "^1.2.1", "@emoji-mart/react": "^1.1.1", - "@fortawesome/fontawesome-svg-core": "^6.4.0", "@fortawesome/free-brands-svg-icons": "^6.4.0", - "@fortawesome/free-solid-svg-icons": "^6.4.0", - "@fortawesome/react-fontawesome": "^0.2.0", "@juggle/resize-observer": "^3.4.0", - "@react-oauth/google": "^0.9.0", "@react-spring/web": "^9.5.5", "@reduxjs/toolkit": "^1.9.1", + "@vitejs/plugin-react": "^4.3.4", + "@windmillcode/quill-emoji": "^2.0.3000", "body-scroll-lock": "^4.0.0-beta.0", "classnames": "^2.3.1", "contrast-color": "^1.0.1", "copy-to-clipboard": "^3.3.2", + "date-fns": "^4.1.0", "dayjs": "^1.11.9", "delay": "^5.0.0", "dexie": "^3.2.2", "dompurify": "^2.4.0", - "dropbox": "^10.34.0", - "emoji-mart": "^5.6.0", "file-saver": "^2.0.5", "fuse.js": "^6.6.2", "html-to-text": "^9.0.4", @@ -45,38 +42,34 @@ "js-cookie": "^3.0.1", "lodash": "^4.17.21", "lucide-react": "^0.453.0", - "next": "^14.2.16", - "next-seo": "^5.11.1", + "pako": "^2.1.0", "parchment": "^2.0.1", - "quill": "^1.3.7", - "quill-auto-detect-url": "^0.2.1", - "quill-mention": "^3.1.0", + "quill": "^2.0.3", + "quill-auto-detect-url": "^1.0.0-alpha.1", + "quill-mention": "6.0.2", "react": "18.3.1", "react-dom": "18.3.1", "react-error-boundary": "^3.1.4", + "react-helmet-async": "^2.0.5", "react-hot-toast": "^2.4.1", "react-i18next": "^12.2.0", - "react-moment": "^1.1.2", "react-multiline-clamp": "^2.0.0", - "react-quill": "^2.0.0", "react-redux": "^8.0.5", - "react-spring": "^9.5.2", + "react-router-dom": "^7.1.5", "react-tailwindcss-select": "^1.6.0", "react-tooltip": "^5.7.4", "react-use-measure": "^2.1.1", "redux": "^4.2.0", - "redux-localstorage": "^0.4.1", - "serve": "^14.2.4", "ts.data.json": "^2.2.0", - "use-sound": "^4.0.1", - "usehooks-ts": "^2.9.1", + "use-sound": "^4.0.3", + "usehooks-ts": "^3.1.0", "uuid": "^9.0.0", + "vite": "^6.0.11", "xxdk-wasm": "^0.3.21" }, "devDependencies": { "@cypress/code-coverage": "^3.13.4", "@cypress/webpack-preprocessor": "^6.0.2", - "@next/bundle-analyzer": "^15.0.2", "@testing-library/cypress": "^10.0.2", "@types/contrast-color": "^1.0.0", "@types/dompurify": "^2.3.4", @@ -87,33 +80,40 @@ "@types/js-cookie": "^3.0.2", "@types/lodash": "^4.14.185", "@types/node": "18.7.14", - "@types/react": "18.3.11", - "@types/react-dom": "18.3.0", + "@types/pako": "^2.0.3", + "@types/react": "^18.2.43", + "@types/react-dom": "^18.2.17", "@types/react-draft-wysiwyg": "^1.13.4", "@types/testing-library__cypress": "^5.0.9", "@types/uuid": "^8.3.4", - "@typescript-eslint/eslint-plugin": "^5.45.0", + "@typescript-eslint/eslint-plugin": "^latest", + "@typescript-eslint/parser": "^latest", + "@vitejs/plugin-react-swc": "^3.5.0", "autoprefixer": "^10.4.20", "babel-plugin-istanbul": "^6.1.1", "cypress": "^13.15.1", - "eslint": "8.23.0", + "eslint": "^latest", "eslint-config-airbnb-typescript": "^17.0.0", - "eslint-config-next": "^13.0.6", "eslint-config-prettier": "^9.1.0", "eslint-plugin-import": "^2.26.0", "eslint-plugin-import-newlines": "^1.3.0", "eslint-plugin-prettier": "^5.2.1", - "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react": "^latest", + "eslint-plugin-react-hooks": "^latest", "eslint-plugin-simple-import-sort": "^8.0.0", "eslint-plugin-sort-destructure-keys": "^1.4.0", - "next-build-id": "^3.0.0", "nyc": "^15.1.0", "postcss": "^8.4.47", "prettier": "^3.3.3", "prettier-plugin-tailwindcss": "^0.4.1", - "sass": "^1.80.5", "tailwindcss": "^3.4.14", - "typed-scss-modules": "^8.0.1", - "typescript": "4.8.2" - } + "typescript": "^5.7.3", + "vite-plugin-eslint": "^1.8.1" + }, + "trustedDependencies": [ + "@swc/core", + "core-js-pure", + "cypress", + "esbuild" + ] } diff --git a/postcss.config.cjs b/postcss.config.cjs new file mode 100644 index 0000000000000000000000000000000000000000..ddc4c8fb3cf5054ef03284c52d66679d373f9a96 --- /dev/null +++ b/postcss.config.cjs @@ -0,0 +1,7 @@ +/* eslint-env node */ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + } +} \ No newline at end of file diff --git a/postcss.config.js b/postcss.config.js index 5cbc2c7d8770dd519eeb059f155ee14aa9dc811a..cb9b0aaa5bdd67441f1cf7d4d6f6cbdba7ba8d24 100644 --- a/postcss.config.js +++ b/postcss.config.js @@ -1,6 +1,6 @@ -module.exports = { +export default { plugins: { tailwindcss: {}, - autoprefixer: {} + autoprefixer: {}, } -}; +} diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000000000000000000000000000000000000..5a5d1253e7184c8d44b082b180a1386fb82e6e4c --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,57 @@ +import React, { useEffect } from 'react'; +import { Outlet } from 'react-router-dom'; +import { Provider } from 'react-redux'; +import { useTranslation } from 'react-i18next'; +import store from './store'; +import { ManagedUIContext } from 'src/contexts/ui-context'; +import { ManagedNetworkContext } from 'src/contexts/network-client-context'; +import { AuthenticationProvider } from 'src/contexts/authentication-context'; +import { UtilsProvider } from 'src/contexts/utils-context'; +import { DBProvider } from 'src/contexts/db-context'; +import { RemoteKVProvider } from 'src/contexts/remote-kv-context'; +import { DMContextProvider } from 'src/contexts/dm-client-context'; +import './i18n'; +import ErrorBoundary from 'src/components/common/ErrorBoundary'; +import { Helmet } from 'react-helmet-async'; +import { SoundProvider } from 'src/contexts/sound-context'; + +const Providers = ({ children }: { children: React.ReactNode }) => ( + <RemoteKVProvider> + <DBProvider> + <Provider store={store}> + <UtilsProvider> + <AuthenticationProvider> + <DMContextProvider> + <ManagedNetworkContext> + <SoundProvider> + <ManagedUIContext>{children}</ManagedUIContext> + </SoundProvider> + </ManagedNetworkContext> + </DMContextProvider> + </AuthenticationProvider> + </UtilsProvider> + </Provider> + </DBProvider> + </RemoteKVProvider> +); + +const App = () => { + const { t } = useTranslation(); + + return ( + <> + <Helmet> + <title>{t('internet haven')}</title> + <link rel='icon' href='/favicon.svg' /> + </Helmet> + <ErrorBoundary> + <Providers> + <Outlet /> + </Providers> + </ErrorBoundary> + <div id='emoji-portal' /> + </> + ); +}; + +export default App; diff --git a/src/assets/css/globals.css b/src/assets/css/globals.css new file mode 100644 index 0000000000000000000000000000000000000000..0ed65fd8348c2b9e67b031a82a425f610f7c9639 --- /dev/null +++ b/src/assets/css/globals.css @@ -0,0 +1,458 @@ +/* Third-party CSS */ +@import './quill-overrides.css'; +@import 'react-tooltip/dist/react-tooltip.css'; + +/* Tailwind Directives */ +@tailwind base; +@tailwind components; +@tailwind utilities; + + +/* Variables */ +:root { + /* Colors */ + --our-black: #07080a; + --near-black: #0a0c0f; + --near-black-80: rgba(10, 12, 15, 0.8); + --charcoal-4: #16181d; + --charcoal-3-20: rgba(46, 49, 55, 0.2); + --charcoal-4-80: rgba(22, 24, 29, 0.8); + --charcoal-4-40: rgba(22, 24, 29, 0.4); + --charcoal-3: #2e3137; + --charcoal-2: #41444a; + --charcoal-1: #6c6e74; + --primary-white: #dadce5; + --light: #ebecf2; + --near-white: #f5f6fa; + --primary: #ecba60; + --primary-15: rgba(236, 186, 96, 0.15); + --red: #e3304b; + --orange: #fa7b48; + --green: #00c291; + --green-10: rgba(0, 194, 145, 0.1); + --blue: #259cdb; + --secondary: var(--blue); + --text-primary: var(--primary-white); + --text-secondary: var(--charcoal-1); + --text-muted: var(--charcoal-2); + --border-radius: 1rem; + --font-sans: "Roboto Flex", sans-serif; + + /* Fonts */ + --font-primary: var(--font-sans); + --font-montserrat: 'Montserrat', sans-serif; + + /* Sizing */ + --browser-context: 10px; + --base-line-height: 1.5; + --base-letter-spacing: 0.25px; + + /* Breakpoints */ + --breakpoint-xs: 425px; + --breakpoint-sm: 640px; + --breakpoint-md: 768px; + --breakpoint-smdtp: 960px; + --breakpoint-lg: 1024px; + --breakpoint-xl: 1280px; + --breakpoint-2xl: 1536px; + + /* Button Colors */ + --button-bg: var(--primary); + --button-hover: var(--secondary); + --button-text: var(--our-black); + --button-disabled: rgba(255, 255, 255, 0.3); +} + +/* Base Styles */ +html { + height: -webkit-fill-available; + box-sizing: border-box; + touch-action: manipulation; + font-feature-settings: "case" 1, "rlig" 1, "calt" 0; + line-height: 1.5; + -webkit-text-size-adjust: 100%; + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + font-family: var(--font-sans); + font-feature-settings: normal; + font-variation-settings: normal; + -webkit-tap-highlight-color: transparent; +} + +body, html { + background-color: var(--near-black); + color: var(--text-primary); + overscroll-behavior-x: none; + overscroll-behavior-y: contain; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +body { + position: relative; + min-height: 100%; + margin: 0; + line-height: inherit; +} + +*, :after, :before { + box-sizing: border-box; + border: 0 solid; + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; +} + +/* Scrollbar Styles */ +::-webkit-scrollbar { + width: 8px; +} + +::-webkit-scrollbar-thumb, +::-webkit-scrollbar-thumb:hover { + background: var(--dark-4); + border-radius: 4px; +} + +::-webkit-scrollbar-track { + background: transparent; +} + +/* Search Input Styles */ +.search { + position: relative; + margin-bottom: 0.5rem; +} + +/* Notification Banner Styles */ +.notification-banner { + padding: 0.5rem 60px; + top: 0; + left: 0; + width: 100%; + display: flex; + justify-content: space-between; +} + +.notification-banner span { + display: block; + max-width: 1440px; + margin: 0 auto; + width: 100%; +} + +.notification-banner button { + color: var(--primary); +} + +.notification-banner svg { + cursor: pointer; +} + +.notification-banner svg path { + fill: var(--primary); + stroke-width: 2px; +} + +/* Join Page Styles */ +.password-wrapper { + display: flex; + flex-direction: column; + align-items: center; +} + +.password-wrapper > div, +.password-wrapper > p, +.password-wrapper .channel-credentials { + width: 100%; + max-width: 534px; +} + +.password-wrapper .button { + color: black; +} + +.password-wrapper .button:disabled:hover { + cursor: not-allowed; +} + +/* Footer Links */ +.footer-link { + font-family: var(--font-montserrat); + font-size: 0.75rem; + line-height: 0.9375rem; + color: #2e3137; + margin: 0 1.25rem; + white-space: nowrap; +} + +.footer-link:hover { + color: var(--text-primary); +} + +/* Typography */ +.headline { + color: var(--text-primary); + font-family: var(--font-primary); + font-weight: 700; + font-stretch: normal; + font-style: normal; + line-height: 1; + letter-spacing: var(--base-letter-spacing); +} + +.headline--xl { + font-size: 40px; + font-weight: 700; +} + +.headline--lg { + font-size: 25px; + font-weight: 700; +} + +.headline--md { + font-size: 22px; + font-weight: 700; +} + +.headline--sm { + font-size: 18px; + font-weight: 700; +} + +.headline--xs { + font-size: 14px; + font-weight: 700; +} + +.headline--text { + font-weight: 700; + font-size: 12px; +} + +/* Heading Styles */ +h1, .h1 { + composes: headline headline--xl; +} + +h2, .h2 { + composes: headline headline--lg; +} + +h3, .h3 { + composes: headline headline--md; +} + +h4, .h4 { + composes: headline headline--sm; +} + +h5, .h5 { + composes: headline headline--xs; +} + +/* Text Styles */ +.text { + font-family: var(--font-primary); + color: var(--text-secondary); + font-size: 14px; + font-weight: 400; + font-stretch: normal; + font-style: normal; + line-height: 1.3; +} + +.text--md { + font-size: 13px; +} + +.text--sm { + font-size: 12px; +} + +.text--xs { + font-size: 11px; + line-height: 13px; +} + +.text-muted { + color: var(--text-muted); +} + +/* Message & Editor Styles */ +.message-body, +.editor { + ul { + list-style-type: disc; + list-style-position: inside; + } + + ol { + list-style-type: decimal; + list-style-position: inside; + } + + ul ul, + ol ul { + list-style-type: circle; + list-style-position: inside; + margin-left: 15px; + } + + ul ul ul, + ol ul ul, + ol ol ul { + list-style-type: square; + list-style-position: inside; + margin-left: 15px; + } + + ol ol, + ul ol { + list-style-type: lower-latin; + list-style-position: inside; + margin-left: 15px; + } + + blockquote:not(.ql-container) { + border-left: 0; + position: relative; + padding-left: 1ch; + white-space: pre-wrap; + } + + blockquote:not(.ql-container)::before { + content: ' '; + width: 0.25rem; + height: 100%; + background-color: var(--grey); + position: absolute; + left: 0; + border-radius: 0.25rem; + } + + blockquote + blockquote::before { + height: calc(100% + 6px); + top: -6px; + } + + code { + background-color: var(--dark-7); + color: var(--light-orange); + padding: 0 0.25ch; + margin: 0 0.25ch; + border-radius: 0.25rem; + } + + pre.ql-syntax { + background-color: var(--dark-7) !important; + color: var(--light-orange); + border-radius: 0.25rem; + padding: 0.25rem 0.5rem; + margin: 0.5rem 0; + white-space: break-spaces; + } +} + +.message { + white-space: break-spaces; +} + +/* Custom global styles can go here */ + +/* Button Styles */ +.button { + background-color: var(--button-bg); + color: var(--button-text); + border-radius: var(--border-radius); + transition: background-color 0.2s ease; + font-weight: 500; +} + +.button:hover:not(:disabled) { + background-color: var(--button-hover); +} + +.button:disabled { + opacity: 0.5; + cursor: not-allowed; + background-color: var(--button-disabled); +} + +.button--secondary { + background-color: transparent; + border: 1px solid var(--button-bg); +} + +.button--secondary:hover:not(:disabled) { + background-color: var(--primary-15); +} + +/* Input Field Styles */ +input[type="text"], +input[type="password"], +input[type="email"], +input[type="search"], +textarea { + background-color: var(--charcoal-4); + color: var(--text-primary); + border: 1px solid var(--charcoal-4-40); + border-radius: var(--border-radius); + padding: 0.5rem 1rem; +} + +input[type="text"]:focus, +input[type="password"]:focus, +input[type="email"]:focus, +input[type="search"]:focus, +textarea:focus { + outline: none; + border-color: var(--primary); + background-color: var(--charcoal-4-80); +} + +input[type="text"]::placeholder, +input[type="password"]::placeholder, +input[type="email"]::placeholder, +input[type="search"]::placeholder, +textarea::placeholder { + color: var(--text-muted); +} + +/* Dark Mode Form Elements */ +select { + background-color: var(--charcoal-4); + color: var(--text-primary); + border: 1px solid var(--charcoal-4-40); + border-radius: var(--border-radius); + padding: 0.5rem 2.5rem 0.5rem 1rem; + appearance: none; + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%23999' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3E%3C/svg%3E"); + background-position: right 0.5rem center; + background-repeat: no-repeat; + background-size: 1.5em 1.5em; +} + +select:focus { + outline: none; + border-color: var(--primary); + background-color: var(--charcoal-4-80); +} + +/* Disabled State */ +input:disabled, +textarea:disabled, +select:disabled { + opacity: 0.5; + cursor: not-allowed; + background-color: var(--charcoal-4-40); +} \ No newline at end of file diff --git a/src/assets/scss/quill-overrides.scss b/src/assets/css/quill-overrides.css similarity index 98% rename from src/assets/scss/quill-overrides.scss rename to src/assets/css/quill-overrides.css index d93687804ae0a32db3d9ac68549f51123e42448f..62ff0cd01227db502cd81550022376e8070579e9 100644 --- a/src/assets/scss/quill-overrides.scss +++ b/src/assets/css/quill-overrides.css @@ -1,5 +1,15 @@ -@import 'react-quill/dist/quill.snow.css'; +.quill-editor { + white-space: pre-wrap; +} +.ql-editor { + white-space: pre-wrap; +} + +.ql-align-justify { + white-space: pre-wrap; +} + .ql-toolbar.ql-snow { border: none; background: none; @@ -10,7 +20,7 @@ justify-content: center; height: 2rem; width: 2.5rem; - padding: 0.25rem; + padding: 0.25rem; background-color: var(--dark-5); border-radius: 5px; margin: 0.25rem; diff --git a/src/assets/scss/_breakpoints.scss b/src/assets/scss/_breakpoints.scss deleted file mode 100644 index a56030b617da1ddd971787df4b6faf240727a881..0000000000000000000000000000000000000000 --- a/src/assets/scss/_breakpoints.scss +++ /dev/null @@ -1,37 +0,0 @@ -@mixin break-min($media) { - @if (type-of($media) == 'number') { - @if (unit($media) == 'px' or unit($media) == 'em') { - @media screen and (min-width: #{$media}) { - @content; - } - } @else { - @media screen and (min-width: #{$media}em) { - @content; - } - } - } @else { - @media screen and (#{$media}) { - @content; - } - } -} - -@mixin break-max($media) { - @if (type-of($media) == 'number') { - @if (unit($media) == 'px' or unit($media) == 'em') { - // -1 px - @media screen and (max-width: #{$media - 0.063}) { - @content; - } - } @else { - // -1 px - @media screen and (max-width: #{$media - 0.063}em) { - @content; - } - } - } @else { - @media screen and (#{$media}) { - @content; - } - } -} diff --git a/src/assets/scss/_typography.scss b/src/assets/scss/_typography.scss deleted file mode 100644 index 514de4b36a7e4c54bca9da78a7fe3bb77a59a7b5..0000000000000000000000000000000000000000 --- a/src/assets/scss/_typography.scss +++ /dev/null @@ -1,169 +0,0 @@ -.headline { - color: var(--text-primary); - font-family: $font-primary; - font-weight: 700; - font-stretch: normal; - font-style: normal; - line-height: 1; - letter-spacing: $base-letter-spacing; - &--xl { - font-size: 40px; - font-weight: 700; - } - - &--lg { - font-size: 25px; - font-weight: 700; - } - - &--md { - font-size: 22px; - font-weight: 700; - } - - &--sm { - font-size: 18px; - font-weight: 700; - } - - &--xs { - font-size: 14px; - font-weight: 700; - } - - &--text { - font-weight: 700; - font-size: 12px; - } -} - -h1, -.h1 { - @extend .headline, .headline--xl; -} - -h2, -.h2 { - @extend .headline, .headline--lg; -} - -h3, -.h3 { - @extend .headline, .headline--md; -} - -h4, -.h4 { - @extend .headline, .headline--sm; -} - -h5, -.h5 { - @extend .headline, .headline--xs; -} - -.text { - font-family: $font-primary; - color: var(--text-secondary); - font-size: 14px; - font-weight: 400; - font-stretch: normal; - font-style: normal; - line-height: 1.3; - - &--md { - font-size: 13px; - } - - &--sm { - font-size: 12px; - } - - &--xs { - font-size: 11px; - line-height: 13px; - } -} - -.message-body, -.editor { - ul { - list-style-type: disc; - list-style-position: inside; - } - - ol { - list-style-type: decimal; - list-style-position: inside; - } - - ul ul, - ol ul { - list-style-type: circle; - list-style-position: inside; - margin-left: 15px; - } - - ul ul ul, - ol ul ul, - ol ol ul { - list-style-type: square; - list-style-position: inside; - margin-left: 15px; - } - - ol ol, - ul ol { - list-style-type: lower-latin; - list-style-position: inside; - margin-left: 15px; - } - - blockquote:not(.ql-container) { - border-left: 0; - position: relative; - padding-left: 1ch; - white-space: pre-wrap; - - &::before { - content: ' '; - width: 0.25rem; - height: 1ch; - background-color: var(--grey); - position: absolute; - left: 0; - height: 100%; - border-radius: 0.25rem; - } - - & + blockquote::before { - height: calc(100% + 6px); - top: -6px; - } - } - - code { - background-color: var(--dark-7); - color: var(--light-orange); - padding: 0 0.25ch; - margin: 0 0.25ch; - border-radius: 0.25rem; - } - - pre.ql-syntax { - background-color: var(--dark-7) !important; - color: var(--light-orange); - border-radius: 0.25rem; - padding: 0.25rem 0.5rem; - margin: 0.5rem 0; - white-space: break-spaces; - } -} - -.message { - white-space: break-spaces; -} - -.text-muted { - color: var(--text-muted); -} diff --git a/src/assets/scss/_variables.css b/src/assets/scss/_variables.css deleted file mode 100644 index c3187eb247a7ae67dfdc9e5826580a08738f93c5..0000000000000000000000000000000000000000 --- a/src/assets/scss/_variables.css +++ /dev/null @@ -1,32 +0,0 @@ -:root { - --our-black: #07080a; - --near-black: #0a0c0f; - --near-black-80: rgba(10, 12, 15, 0.8); - --charcoal-4: #16181d; - --charcoal-3-20: rgba(46, 49, 55, 0.2); - --charcoal-4-80: rgba(22, 24, 29, 0.8); - --charcoal-4-40: rgba(22, 24, 29, 0.4); - --charcoal-3: #2e3137; - --charcoal-2: #41444a; - --charcoal-1: #6c6e74; - --primary-white: #dadce5; - --light: #ebecf2; - --near-white: #f5f6fa; - - --primary: #ecba60; - --primary-15: rgba(236, 186, 96, 0.15); - --red: #e3304b; - --orange: #fa7b48; - --green: #00c291; - --green-10: rgba(0, 194, 145, 0.1); - --blue: #259cdb; - - --secondary: var(--blue); - - --text-primary: var(--primary-white); - --text-secondary: var(--charcoal-1); - --text-muted: var(--charcoal-2); - --border-radius: 1rem; - - --font-sans: 'Roboto Flex', sans-serif; -} diff --git a/src/assets/scss/_variables.scss b/src/assets/scss/_variables.scss deleted file mode 100644 index 33802e332cd37c7a587620213d123cad078824f7..0000000000000000000000000000000000000000 --- a/src/assets/scss/_variables.scss +++ /dev/null @@ -1,33 +0,0 @@ -// Colors -$primary: var(--primary); -$secondary: var(--secondary); - -$text-primary: var(--text-primary); -$text-secondary: var(--text-secondary); - -// Fonts -$font-primary: var(--font-sans); - -// Browser Context Sizing for unit/measurement -$browser-context: 10px; -$base-line-height: 1.5; -$base-letter-spacing: 0.25px; - -// Breakpoints -$breakpoints: ( - xs: 425px, - sm: 640px, - md: 768px, - smdtp: 960px, - lg: 1024px, - xl: 1280px, - 2xl: 1536px -); - -$mobile: map-get($breakpoints, xs); -$mobile-wide: map-get($breakpoints, sm); -$tablet: map-get($breakpoints, md); -$tablet-wide: map-get($breakpoints, lg); -$small-desktop: map-get($breakpoints, smdtp); -$desktop: map-get($breakpoints, xl); -$desktop-wide: map-get($breakpoints, 2xl); diff --git a/src/assets/scss/base.scss b/src/assets/scss/base.scss deleted file mode 100644 index b8703cfb595fa85d7f7ddc65cc581e1572457a60..0000000000000000000000000000000000000000 --- a/src/assets/scss/base.scss +++ /dev/null @@ -1,57 +0,0 @@ -*, -*:before, -*:after { - box-sizing: inherit; -} - -html { - height: -webkit-fill-available; - box-sizing: border-box; - touch-action: manipulation; - font-feature-settings: - 'case' 1, - 'rlig' 1, - 'calt' 0; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -html, -body { - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - background-color: var(--near-black); - color: $text-primary; - overscroll-behavior-x: none; - overscroll-behavior-y: contain; -} - -body { - position: relative; - min-height: 100%; - margin: 0; -} - -/* width */ -::-webkit-scrollbar { - width: 8px; -} - -/* Track */ -::-webkit-scrollbar-track { - background: none; -} - -/* Handle */ -::-webkit-scrollbar-thumb { - background: var(--dark-4); - border-radius: 4px; -} - -/* Handle on hover */ -::-webkit-scrollbar-thumb:hover { - background: var(--dark-4); - border-radius: 4px; -} diff --git a/src/assets/scss/main.scss b/src/assets/scss/main.scss deleted file mode 100644 index 43ffa30b803ef5861b0e20e934cd885c837059c6..0000000000000000000000000000000000000000 --- a/src/assets/scss/main.scss +++ /dev/null @@ -1,16 +0,0 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; - -@import url('https://fonts.googleapis.com/css2?family=Roboto+Flex:wght@100;400;500;600;700&display=swap'); - -* { - font-family: 'Roboto Flex', sans-serif; -} - -$border-radius: 12px; - -@import url('./_variables.css'); -@import 'variables'; -@import 'typography'; -@import './base'; diff --git a/src/components/common/Alert/index.tsx b/src/components/common/Alert/index.tsx index 2ed5b8d66bbbf2c884b6218a9236616af25b7b71..6ebd5422201a0c35701a5f67b630695f42beba83 100644 --- a/src/components/common/Alert/index.tsx +++ b/src/components/common/Alert/index.tsx @@ -1,9 +1,9 @@ import React, { FC, SVGProps, useCallback, useMemo, useState } from 'react'; import cn from 'classnames'; -import Checkmark from '@components/icons/Checkmark'; -import X from '@components/icons/X'; -import Warning from '@components/icons/Warning'; +import Checkmark from '../../icons/Checkmark'; +import X from '../../icons/X'; +import Warning from '../../icons/Warning'; export type AlertType = { type: 'success' | 'error' | 'warning'; diff --git a/src/components/common/Badge.module.scss b/src/components/common/Badge.module.scss deleted file mode 100644 index 129141f1352419efd58eabf3626452ff1c65a192..0000000000000000000000000000000000000000 --- a/src/components/common/Badge.module.scss +++ /dev/null @@ -1,27 +0,0 @@ -.badge { - font-size: 0.5rem; - font-style: normal; - font-weight: 700; - line-height: normal; - letter-spacing: 0.05rem; - text-transform: uppercase; - padding: 0.1875rem 0.25rem 0.125rem 0.25rem; - border-radius: 3px; - - border: 1px solid var(--charcoal-2, #41444a); - - &.blue { - color: var(--blue); - border-color: var(--blue); - } - - &.gold { - color: var(--primary); - border-color: var(--primary); - } - - &.grey { - border-color: var(--charcoal-2); - color: var(--charcoal-2); - } -} diff --git a/src/components/common/Badge.tsx b/src/components/common/Badge.tsx index 71ec66a9890519744a60a5375705b36900e3e290..48002005d942ea839cc800998ebc39073780c71f 100644 --- a/src/components/common/Badge.tsx +++ b/src/components/common/Badge.tsx @@ -1,14 +1,28 @@ import React, { FC, HTMLAttributes } from 'react'; -import cn from 'classnames'; - -import s from './Badge.module.scss'; type Props = HTMLAttributes<HTMLSpanElement> & { color?: 'gold' | 'blue' | 'grey' }; -const Badge: FC<Props> = ({ children, color = 'blue', ...props }) => ( - <span {...props} className={cn(s.badge, s[color], props.className)}> - {children} - </span> -); +const Badge: FC<Props> = ({ children, color = 'blue', ...props }) => { + const colorClasses = { + blue: 'text-[var(--blue)] border-[var(--blue)]', + gold: 'text-[var(--primary)] border-[var(--primary)]', + grey: 'text-[var(--charcoal-2)] border-[var(--charcoal-2)]' + }; + + return ( + <span + {...props} + className={` + text-[0.5rem] font-bold leading-normal tracking-[0.05rem] uppercase + py-[0.1875rem] px-1 pb-[0.125rem] + rounded border border-[var(--charcoal-2)] + ${colorClasses[color]} + ${props.className || ''} + `} + > + {children} + </span> + ); +}; export default Badge; diff --git a/src/components/common/ChannelBadges.tsx b/src/components/common/ChannelBadges.tsx index 0410b6de973b7740bcd46e8adeb30bc4b96dd8eb..10d2296496558d69e4594ce95234190ad7c1bcec 100644 --- a/src/components/common/ChannelBadges.tsx +++ b/src/components/common/ChannelBadges.tsx @@ -1,4 +1,4 @@ -import { type Channel, PrivacyLevel } from '@types'; +import { type Channel, PrivacyLevel } from '../../types'; import { FC, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; diff --git a/src/components/common/ChannelChat/ChannelChat.tsx b/src/components/common/ChannelChat/ChannelChat.tsx index 633420590c3f173782541c0fb822c9f9baee3025..29876334636164e698660c5c81401767492780dd 100644 --- a/src/components/common/ChannelChat/ChannelChat.tsx +++ b/src/components/common/ChannelChat/ChannelChat.tsx @@ -11,8 +11,8 @@ import * as dms from 'src/store/dms'; import { useAppSelector } from 'src/store/hooks'; import ScrollDiv from './ScrollDiv'; import { useTranslation } from 'react-i18next'; -import { EasterEggs, useUI } from '@contexts/ui-context'; -import Spaceman from '@components/icons/Spaceman'; +import { EasterEggs, useUI } from '../../../contexts/ui-context'; +import Spaceman from '../../icons/Spaceman'; type Props = { messages: Message[]; diff --git a/src/components/common/ChannelChat/ChatMessage/ChatMessage.module.scss b/src/components/common/ChannelChat/ChatMessage/ChatMessage.module.scss deleted file mode 100644 index 5f817e8c5169ef3b4427930cc2e2cd337fe26354..0000000000000000000000000000000000000000 --- a/src/components/common/ChannelChat/ChatMessage/ChatMessage.module.scss +++ /dev/null @@ -1,94 +0,0 @@ -.root { - padding: 8px 16px; - position: relative; - - .sender { - display: flex; - align-items: center; - - svg { - margin-right: 1px; - width: 12px; - margin-bottom: -0.5px; - } - } - - &__withReply { - .replyToMessageBody { - font-size: 13px; - background-color: var(--dark-4); - max-width: fit-content; - margin-top: 4px; - margin-bottom: 8px; - padding: 6px; - border-radius: 5px; - a { - color: var(--cyan); - } - - cursor: pointer; - .sender { - svg { - width: 8px; - margin-bottom: -0.5px; - } - font-size: 10px; - } - } - } - - .sender { - color: var(--cyan); - font-size: 14px; - font-weight: 700; - } - - .separator { - font-size: 12px; - } - - .messageTimestamp { - font-size: 10px; - font-weight: 400; - margin-left: 6px; - } - - .body { - font-size: 14px; - } - - .replyToMessage { - cursor: pointer; - span { - color: var(--cyan); - font-size: 12px; - font-weight: 700; - } - } -} - -.timestamp { - padding: 4px !important; - span { - font-size: 9px !important; - font-weight: 400; - color: var(--cyan) !important; - } -} - -.messageBody { - p:empty { - margin-bottom: 1rem; - } - - &__failed { - color: var(--red) !important; - } - a { - color: var(--cyan); - } -} - -.sender { - white-space: nowrap; -} diff --git a/src/components/common/ChannelChat/ChatMessage/ChatMessage.tsx b/src/components/common/ChannelChat/ChatMessage/ChatMessage.tsx index 617d4a31cd7a2973c1c94e06de851e255dd3bccf..d48ec500a3e6b63bf218f3c1d1fe13a0277b267f 100644 --- a/src/components/common/ChannelChat/ChatMessage/ChatMessage.tsx +++ b/src/components/common/ChannelChat/ChatMessage/ChatMessage.tsx @@ -9,12 +9,10 @@ import React, { useRef, useState } from 'react'; -import cn from 'classnames'; import Clamp from 'react-multiline-clamp'; import { useTranslation } from 'react-i18next'; import Identity from 'src/components/common/Identity'; -import s from './ChatMessage.module.scss'; import ChatReactions from '../ChatReactions'; import Spinner from '@components/common/Spinner'; import { useAppDispatch, useAppSelector } from 'src/store/hooks'; @@ -34,6 +32,10 @@ type Props = HTMLAttributes<HTMLDivElement> & { noReply?: boolean; }; +type ClampToggleProps = { + toggle: () => void; +}; + const HoveredMention = ({ codename }: { codename: string }) => { const contributors = useAppSelector(selectors.currentContributors); const mentioned = useMemo( @@ -91,22 +93,21 @@ const ChatMessage: FC<Props> = ({ clamped, message, noReply, ...htmlProps }) => data-testid='message-container' id={message.id} {...htmlProps} - className={cn( - htmlProps.className, - 'transition-all', - { - 'bg-charcoal-4-40 border-l-2 border-charcoal-2': highlighted, - 'bg-near-black hover:bg-charcoal-4-40': - (!message.id || message.id !== userReplyId) && !htmlProps.className?.includes('bg-'), - 'bg-green-10 border-l-2 border-green': - userReplyId && message.id === userReplyId && !noReply - }, - s.root, - { - [s.root__withReply]: message.repliedTo !== null - }, - htmlProps.className - )} + className={` + px-4 py-2 relative transition-all + ${highlighted ? 'bg-charcoal-4-40 border-l-2 border-charcoal-2' : ''} + ${ + (!message.id || message.id !== userReplyId) && !htmlProps.className?.includes('bg-') + ? 'bg-near-black hover:bg-charcoal-4-40' + : '' + } + ${ + userReplyId && message.id === userReplyId && !noReply + ? 'bg-green-10 border-l-2 border-green' + : '' + } + ${htmlProps.className || ''} + `} > {repliedToMessage && !noReply && ( <div @@ -142,16 +143,16 @@ const ChatMessage: FC<Props> = ({ clamped, message, noReply, ...htmlProps }) => {hoveredMention && <HoveredMention codename={hoveredMention} />} </Tooltip> <div className='w-full'> - <div className='shrink truncate overflow-hidden break-word hyphens-auto'> - <div className={cn(s.header)}> + <div className='shrink truncate overflow-hidden break-words hyphens-auto'> + <div className='flex items-center'> {message.repliedTo !== null ? ( <> <Identity clickable {...message} /> - <span className={cn(s.separator, 'mx-1')}>{t('replied to')}</span> + <span className='mx-1 text-xs'>{t('replied to')}</span> {repliedToMessage ? ( <Identity clickable {...repliedToMessage} /> ) : ( - <span className={cn(s.separator, '')}> + <span className='text-xs'> <strong>{t('deleted/unknown')}</strong> </span> )} @@ -159,11 +160,12 @@ const ChatMessage: FC<Props> = ({ clamped, message, noReply, ...htmlProps }) => ) : ( <Identity clickable {...message} /> )} - <span className={cn(s.messageTimestamp)}> + <span className='text-[10px] font-normal ml-1.5'> {dayjs(message.timestamp).format('hh:mm A')} </span> - {message.status === MessageStatus.Unsent || - (message.status === MessageStatus.Sent && <Spinner size='xs' />)} + {(message.status === MessageStatus.Unsent || message.status === MessageStatus.Sent) && ( + <Spinner size='xs' /> + )} {message.round !== 0 && ( <a href={`https://dashboard.xx.network/rounds/${message.round}`} @@ -178,21 +180,19 @@ const ChatMessage: FC<Props> = ({ clamped, message, noReply, ...htmlProps }) => )} {message.status === MessageStatus.Failed && ( - <span className='text-xs' style={{ color: 'var(--red)' }}> - ({t('Failed')}) - </span> + <span className='text-xs text-red'>({t('Failed')})</span> )} </div> - <div className={cn('message-body', s.body)}> + <div className='text-sm'> <Clamp - showMoreElement={({ toggle }: { toggle: () => void }) => ( - <button style={{ color: 'var(--cyan)' }} type='button' onClick={toggle}> + showMoreElement={({ toggle }: ClampToggleProps) => ( + <button className='text-cyan' type='button' onClick={toggle}> {t('Show more')} </button> )} - showLessElement={({ toggle }: { toggle: () => void }) => ( - <button style={{ color: 'var(--cyan)' }} type='button' onClick={toggle}> + showLessElement={({ toggle }: ClampToggleProps) => ( + <button className='text-cyan' type='button' onClick={toggle}> {t('Show less')} </button> )} @@ -202,9 +202,7 @@ const ChatMessage: FC<Props> = ({ clamped, message, noReply, ...htmlProps }) => > {message.body ? ( <div - className={cn('message', s.messageBody, { - [s.messageBody__failed]: message.status === MessageStatus.Failed - })} + className={`message ${message.status === MessageStatus.Failed ? 'text-red' : ''}`} dangerouslySetInnerHTML={{ __html: message.body }} diff --git a/src/components/common/ChannelChat/ChatReactions/index.tsx b/src/components/common/ChannelChat/ChatReactions/index.tsx index 54c8535a70fecbf77b6eb88b068c619dee878da4..abcfe3496345c7926443d9a7e87af2bf20c3f41a 100644 --- a/src/components/common/ChannelChat/ChatReactions/index.tsx +++ b/src/components/common/ChannelChat/ChatReactions/index.tsx @@ -1,12 +1,10 @@ -import { Message, MessageStatus } from '@types'; +import { Message, MessageStatus } from '../../../../types'; import React, { FC, useCallback, useMemo } from 'react'; -import cn from 'classnames'; import { Tooltip } from 'react-tooltip'; import { uniqueId } from 'lodash'; import { useTranslation } from 'react-i18next'; -import s from './styles.module.scss'; import * as messages from 'src/store/messages'; import * as identity from 'src/store/identity'; import * as app from 'src/store/app'; @@ -48,22 +46,26 @@ const ChatReactions: FC<Props> = ({ message }) => { return ( <> - <div className={cn('space-x-1', s.wrapper)}> + <div className='relative flex items-center flex-wrap mt-2 space-x-1'> {reactions?.map( ([emoji, reactionInfos]) => reactionInfos?.length > 0 && ( <div key={`${id}-${message.id}-${emoji}`} id={`${id}-${message.id}-${emoji}-emojis-users-reactions`} - className={cn('hover:bg-charcoal-3', s.emoji, { - 'bg-primary-15 border border-primary': reactionInfos - .map((i) => i.pubkey) - .includes(userPubkey ?? '') - })} + className={` + mr-0.5 px-1.5 rounded-[10px] flex items-center text-base cursor-pointer + hover:bg-charcoal-3 + ${ + reactionInfos.map((i) => i.pubkey).includes(userPubkey ?? '') + ? 'bg-primary-15 border border-primary' + : '' + } + `} onClick={() => toggleReaction(emoji, message.id)} > <span className='mr-1'>{emoji}</span> - <span className={cn(s.count)}>{reactionInfos.length}</span> + <span className='text-[10px]'>{reactionInfos.length}</span> {reactionInfos.filter((i) => i.status !== MessageStatus.Delivered).length > 0 && ( <Spinner size='xs' /> )} @@ -83,13 +85,13 @@ const ChatReactions: FC<Props> = ({ message }) => { {reactions?.map(([emoji, users]) => ( <Tooltip clickable - className={s.tooltip} + className='!p-1 !pb-2 !opacity-100 !max-w-[320px] !max-h-[350px] overflow-auto rounded' key={emoji} anchorId={`${id}-${message.id}-${emoji}-emojis-users-reactions`} place={'bottom'} > - <div className={cn(s.icon)}>{emoji}</div> - <p> + <div className='text-[48px] text-center'>{emoji}</div> + <p className='text-xs font-medium text-center'> {users.slice(0, Math.max(1, users.length - 1)).map((u, i) => ( <> {i > 0 && ', '} diff --git a/src/components/common/ChannelChat/ChatReactions/styles.module.scss b/src/components/common/ChannelChat/ChatReactions/styles.module.scss deleted file mode 100644 index 2ccd33b73fa0953e5c3c32d852e6b3831d089adc..0000000000000000000000000000000000000000 --- a/src/components/common/ChannelChat/ChatReactions/styles.module.scss +++ /dev/null @@ -1,43 +0,0 @@ -.wrapper { - position: relative; - display: flex; - align-items: center; - flex-wrap: wrap; - margin-top: 8px; - - .emoji { - margin-right: 2px; - padding: 0px 6px; - border-radius: 10px; - display: flex; - align-items: center; - font-size: 16px; - cursor: pointer; - - .count { - font-size: 10px; - } - } -} - -.tooltip { - position: absolute; - z-index: 1; - padding: 4px 8px 8px 8px !important; - opacity: 1 !important; - max-width: 320px !important; - max-height: 350px !important; - overflow: auto; - border-radius: 5px; - - .icon { - font-size: 48px; - text-align: center; - } - - p { - font-size: 12px !important; - font-weight: 500; - text-align: center; - } -} diff --git a/src/components/common/ChannelChat/MessageActions/MessageActions.module.scss b/src/components/common/ChannelChat/MessageActions/MessageActions.module.scss deleted file mode 100644 index ac4b804a632029284c030047bf44f31431a23232..0000000000000000000000000000000000000000 --- a/src/components/common/ChannelChat/MessageActions/MessageActions.module.scss +++ /dev/null @@ -1,24 +0,0 @@ -.root { - display: flex; - align-items: center; - border-radius: 4px; - padding: 0.25rem 0.25rem; - - & > div, - & > svg { - &:hover { - transform: scale(1.1); - } - - height: 1.5rem; - max-width: 1.25rem; - margin: 0 4px; - color: var(--primary); - cursor: pointer; - } -} - -.emojisPickerWrapper { - position: absolute; - z-index: 1; -} diff --git a/src/components/common/ChannelChat/MessageActions/index.tsx b/src/components/common/ChannelChat/MessageActions/index.tsx index 33b4bb35240326241cec7df992662844f95061c1..b59afdbd63d3237747101799535ce19ccb742e4c 100644 --- a/src/components/common/ChannelChat/MessageActions/index.tsx +++ b/src/components/common/ChannelChat/MessageActions/index.tsx @@ -1,20 +1,16 @@ import React, { FC, useCallback, useEffect, useState, HTMLAttributes } from 'react'; - -import cn from 'classnames'; - import { Delete, Reply } from 'src/components/icons'; import { Mute, Pin } from 'src/components/icons'; import { useUI } from 'src/contexts/ui-context'; - import { useAppSelector } from 'src/store/hooks'; -import Envelope from '@components/icons/Envelope'; +import Envelope from 'src/components/icons/Envelope'; import { userIsMuted as userIsMutedSelector } from 'src/store/selectors'; import * as dms from 'src/store/dms'; import { AppEvents, awaitAppEvent as awaitEvent } from 'src/events'; -import { WithChildren } from '@types'; +import { WithChildren } from 'src/types'; import useDmClient from 'src/hooks/useDmClient'; -import { EmojiPicker } from '@components/common/EmojiPortal'; -import Block from '@components/icons/Block'; +import { EmojiPicker } from 'src/components/common/EmojiPortal'; +import Block from 'src/components/icons/Block'; type Props = HTMLAttributes<HTMLDivElement> & { isMuted: boolean; @@ -36,7 +32,10 @@ const MessageAction: FC<WithChildren & HTMLAttributes<HTMLButtonElement>> = ({ ...props }) => { return ( - <button {...props} className={cn('text-charcoal-1 hover:text-primary w-5', props.className)}> + <button + {...props} + className={`text-charcoal-1 hover:text-primary w-5 ${props.className || ''}`} + > {children} </button> ); @@ -83,17 +82,12 @@ const MessageActions: FC<Props> = ({ closeModal(); }); } - - return () => {}; }, [closeModal, loading, openModal, setModalView]); return ( <div {...props} - className={cn( - props.className, - 'bg-near-black-80 p-3 backdrop-blur-md space-x-4 rounded-lg z-10' - )} + className={`${props.className || ''} bg-near-black-80 p-3 backdrop-blur-md space-x-4 rounded-lg z-10`} > <> {dmsEnabled && ( @@ -103,7 +97,7 @@ const MessageActions: FC<Props> = ({ )} {isAdmin && !isOwn && ( <MessageAction onClick={() => onMuteUser(isMuted)}> - <Mute className={cn({ 'text-primary': isMuted })} /> + <Mute className={isMuted ? 'text-primary' : ''} /> </MessageAction> )} {isBlocked && !isOwn && ( diff --git a/src/components/common/ChannelChat/MessageContainer/MessageContainer.module.scss b/src/components/common/ChannelChat/MessageContainer/MessageContainer.module.scss deleted file mode 100644 index a43278e6eb8359b689573d95058fddbbd2fb2ae8..0000000000000000000000000000000000000000 --- a/src/components/common/ChannelChat/MessageContainer/MessageContainer.module.scss +++ /dev/null @@ -1,15 +0,0 @@ -.container { - position: relative; -} - -.actions { - display: none; - position: absolute; - right: 1rem; - top: -1.25rem; - box-shadow: 0px 1px 4px rgba(0, 0, 0, 0.25); -} - -.show { - display: flex; -} diff --git a/src/components/common/ChannelChat/MessageContainer/index.tsx b/src/components/common/ChannelChat/MessageContainer/index.tsx index 0f7c08a1e26066edbf7defce16238e527c1a9a48..50c9726133c34b1d1a7b48f44bbe659d1f91e61d 100644 --- a/src/components/common/ChannelChat/MessageContainer/index.tsx +++ b/src/components/common/ChannelChat/MessageContainer/index.tsx @@ -1,8 +1,7 @@ -import { Message, MessageStatus } from 'src/types'; +import { Message, MessageStatus, MuteUserAction } from 'src/types'; import { FC, useEffect } from 'react'; import { useCallback, useState } from 'react'; -import cn from 'classnames'; import { useTranslation } from 'react-i18next'; import MessageActions from '../MessageActions'; @@ -10,7 +9,7 @@ import ChatMessage from '../ChatMessage/ChatMessage'; import { useNetworkClient } from 'src/contexts/network-client-context'; import useToggle from 'src/hooks/useToggle'; import PinMessageModal from 'src/components/modals/PinMessageModal'; -import MuteUserModal, { MuteUserAction } from 'src/components/modals/MuteUser'; +import MuteUserModal from 'src/components/modals/MuteUser'; import DeleteMessageModal from 'src/components/modals/DeleteMessage'; import * as channels from 'src/store/channels'; import * as app from 'src/store/app'; @@ -18,17 +17,16 @@ import { useAppDispatch, useAppSelector } from 'src/store/hooks'; import * as identity from 'src/store/identity'; import { AppEvents, awaitAppEvent } from 'src/events'; -import classes from './MessageContainer.module.scss'; import useAsync from 'src/hooks/useAsync'; import { useUI } from '@contexts/ui-context'; import useDmClient from 'src/hooks/useDmClient'; import assert from 'assert'; type Props = { - className?: string; + message: Message; clamped?: boolean; + className?: string; readonly?: boolean; - message: Message; }; const MessageContainer: FC<Props> = ({ clamped = false, className, message, readonly }) => { @@ -128,7 +126,9 @@ const MessageContainer: FC<Props> = ({ clamped = false, className, message, read const asyncMuter = useAsync(handleMute); const dmUser = useCallback(() => { - assert(message.dmToken, 'dmToken is required to dm a user'); + if (!message.dmToken) { + throw new Error('dmToken is required to dm a user'); + } setLeftSidebarView('dms'); dispatch(app.actions.selectUser(message.pubkey)); createConversation({ @@ -153,10 +153,8 @@ const MessageContainer: FC<Props> = ({ clamped = false, className, message, read <> {isNewMessage && ( <div className='relative flex items-center px-4'> - <div className='flex-grow border-t' style={{ borderColor: 'var(--primary)' }}></div> - <span className='flex-shrink mx-4' style={{ color: 'var(--primary)' }}> - {t('New!')} - </span> + <div className='flex-grow border-t border-primary'></div> + <span className='flex-shrink mx-4 text-primary'>{t('New!')}</span> </div> )} {!readonly && ( @@ -171,14 +169,15 @@ const MessageContainer: FC<Props> = ({ clamped = false, className, message, read <PinMessageModal onConfirm={pinSelectedMessage} onCancel={hidePinModal} /> )} {message.status === MessageStatus.Delivered && ( - <div className={classes.container}> + <div className='relative'> <MessageActions pubkey={message.pubkey} onMouseEnter={() => setShowActionsWrapper(true)} onMouseLeave={() => setShowActionsWrapper(false)} - className={cn(classes.actions, { - [classes.show]: showActionsWrapper - })} + className={` + absolute right-4 -top-12 opacity-0 transition-opacity duration-200 + ${showActionsWrapper ? 'opacity-100' : ''} + `} onDmClicked={dmUser} dmsEnabled={message.dmToken !== undefined} isPinned={message.pinned} diff --git a/src/components/common/ChannelChat/MessagesContainer/MessagesContainer.module.scss b/src/components/common/ChannelChat/MessagesContainer/MessagesContainer.module.scss deleted file mode 100644 index fec7fbafc72b7dab6f3ca890f91dfd83c6e0995c..0000000000000000000000000000000000000000 --- a/src/components/common/ChannelChat/MessagesContainer/MessagesContainer.module.scss +++ /dev/null @@ -1,28 +0,0 @@ -.dayMessagesWrapper { - position: relative; - padding-top: 1rem; - - .separator { - position: absolute; - top: 33px; - height: 1px; - width: 100%; - background-color: var(--secondary); - } - - .currentDay { - display: inline-block; - height: 31px; - padding: 6px 12px; - font-size: 12px; - font-weight: 700; - border-radius: 30px; - border: 1px solid var(--secondary); - position: sticky; - top: 0; - left: 50%; - transform: translateX(-50%); - background-color: var(--dark-5); - color: var(--text-secondary); - } -} diff --git a/src/components/common/ChannelChat/MessagesContainer/index.tsx b/src/components/common/ChannelChat/MessagesContainer/index.tsx index 9445367f033ebaec5413f3ee407f9385856e4cb8..b0051a9bda487ce164b242a4d1f169c52fb62dfb 100644 --- a/src/components/common/ChannelChat/MessagesContainer/index.tsx +++ b/src/components/common/ChannelChat/MessagesContainer/index.tsx @@ -1,26 +1,18 @@ -import type { Message } from '@types'; -import { FC, HTMLAttributes } from 'react'; - -import React, { useMemo } from 'react'; +import { Message } from 'src/types'; +import { FC, useMemo } from 'react'; import dayjs from 'dayjs'; -import _ from 'lodash'; -import cn from 'classnames'; - import MessageContainer from '../MessageContainer'; -import { byEntryTimestamp } from 'src/utils/index'; - -import s from './MessagesContainer.module.scss'; +import { formatDate } from 'src/utils/date'; +import _ from 'lodash'; -type Props = HTMLAttributes<HTMLDivElement> & { - readonly?: boolean; +type Props = { messages: Message[]; + readonly?: boolean; + children?: React.ReactNode; }; -const formatDate = (date: string, datetime?: string) => { - const d = dayjs(date); - - return d.isToday() ? `Today ${dayjs(datetime).format('h A')}` : d.format('YYYY/MM/DD'); -}; +const byEntryTimestamp = ([a]: [string, Message[]], [b]: [string, Message[]]) => + dayjs(a).isAfter(dayjs(b)) ? 1 : -1; const MessagesContainer: FC<Props> = ({ messages, readonly = false, ...props }) => { const sortedGroupedMessagesPerDay = useMemo(() => { @@ -34,7 +26,7 @@ const MessagesContainer: FC<Props> = ({ messages, readonly = false, ...props }) return ( <div data-testid='messages-container'> {sortedGroupedMessagesPerDay.map(([key, msgs]) => ( - <div className={cn(s.dayMessagesWrapper)} key={key}> + <div className='mb-4' key={key}> <div className='flex items-center my-1'> <hr className='border-charcoal-4 w-full' /> <span className='flex-grow mx-4 whitespace-nowrap text-charcoal-1 text-xs'> diff --git a/src/components/common/ChannelChat/ScrollDiv/index.tsx b/src/components/common/ChannelChat/ScrollDiv/index.tsx index 28a7dd61de79388916c2224a93cdc00ea56e943a..020daf6759ec76ba795bd29808f2ef3a697309ba 100644 --- a/src/components/common/ChannelChat/ScrollDiv/index.tsx +++ b/src/components/common/ChannelChat/ScrollDiv/index.tsx @@ -8,10 +8,7 @@ import React, { MouseEventHandler } from 'react'; -import cn from 'classnames'; - -import s from './scrolldiv.module.scss'; -import { useElementSize } from 'usehooks-ts'; +import { useResizeObserver } from 'usehooks-ts'; const THUMB_MIN_HEIGHT = 20; @@ -38,7 +35,10 @@ const ScrollDiv: FC<Props> = ({ const [lastScrollThumbPosition, setScrollThumbPosition] = useState(0); const [isDragging, setDragging] = useState(false); const scrollHostRef = useRef<HTMLDivElement>(null); - const [itemsRef, { height }] = useElementSize(); + const { width, height } = useResizeObserver<HTMLDivElement>({ + ref: scrollHostRef, + box: 'border-box' + }); const scrollThumb = useRef<HTMLDivElement>(null); const handleScrollThumbMouseDown = useCallback<MouseEventHandler<HTMLDivElement>>((e) => { @@ -187,19 +187,37 @@ const ScrollDiv: FC<Props> = ({ }, [handleDocumentMouseMove, handleDocumentMouseUp]); return ( - <div className={cn(s['scrollhost-container'], className)}> - <div ref={scrollHostRef} className={cn(s.scrollhost)} {...rest}> - <div className='mt-auto' ref={itemsRef}> + <div + className={` + relative h-full pr-2 + group + ${className || ''} + `} + > + <div + ref={scrollHostRef} + className={` + overflow-auto h-full relative + flex max-w-full flex-col flex-nowrap + scrollbar-none + `} + {...rest} + > + <div className='mt-auto' ref={scrollHostRef}> {children} </div> </div> <div - className={s['scroll-bar']} - style={{ opacity: 1, visibility: isDragging ? 'visible' : undefined }} + className={` + invisible group-hover:visible + w-2.5 h-full right-0 top-0 absolute + rounded-lg bottom-0 bg-black/35 + ${isDragging ? '!visible' : ''} + `} > <div ref={scrollThumb} - className={s['scroll-thumb']} + className='w-2 ml-0.5 absolute rounded-lg opacity-100 bg-charcoal-3' style={{ height: thumbHeight, top: scrollThumbTop }} onMouseDown={handleScrollThumbMouseDown} /> diff --git a/src/components/common/ChannelChat/ScrollDiv/scrolldiv.module.scss b/src/components/common/ChannelChat/ScrollDiv/scrolldiv.module.scss deleted file mode 100644 index 3f9473c2ff68e05d693856b1a6029a71b5a4eecb..0000000000000000000000000000000000000000 --- a/src/components/common/ChannelChat/ScrollDiv/scrolldiv.module.scss +++ /dev/null @@ -1,49 +0,0 @@ -.scrollhost::-webkit-scrollbar { - display: none; -} - -.scrollhost-container { - position: relative; - height: 100%; - padding-right: 0.5rem; - - &:hover { - .scroll-bar { - visibility: visible; - } - } -} - -.scrollhost { - overflow: auto; - height: 100%; - scrollbar-width: none; - -ms-overflow-style: none; - position: relative; - display: flex; - max-width: 100%; - flex-flow: column nowrap; -} - -.scroll-bar { - visibility: hidden; - width: 10px; - height: 100%; - right: 0; - top: 0px; - position: absolute; - border-radius: 7px; - bottom: 0px; - background-color: rgba(0, 0, 0, 0.35); -} - -.scroll-thumb { - width: 8px; - height: 20px; - margin-left: 1px; - position: absolute; - border-radius: 7px; - opacity: 1; - top: 0; - background-color: var(--charcoal-3); -} diff --git a/src/components/common/ChannelChat/SendButton/SendButton.module.scss b/src/components/common/ChannelChat/SendButton/SendButton.module.scss deleted file mode 100644 index b58b5dc0eefdeaaaad36085ac66b2debdf841b45..0000000000000000000000000000000000000000 --- a/src/components/common/ChannelChat/SendButton/SendButton.module.scss +++ /dev/null @@ -1,23 +0,0 @@ -.root { - cursor: pointer; - outline: none; - border: none; - display: flex; - align-items: center; - color: var(--primary); - font-size: 16px; - font-weight: 700; - - svg, - path { - fill: var(--primary); - } - - &[disabled] { - color: var(--red); - svg, - path { - fill: var(--red); - } - } -} diff --git a/src/components/common/ChannelChat/SendButton/index.tsx b/src/components/common/ChannelChat/SendButton/index.tsx index 1e9cd0c6470b42c62d960307d2290a7bcd2aa760..4fa5098a8965875601fa795aca6279c0e6f84be9 100644 --- a/src/components/common/ChannelChat/SendButton/index.tsx +++ b/src/components/common/ChannelChat/SendButton/index.tsx @@ -1,6 +1,4 @@ import { ButtonHTMLAttributes, FC } from 'react'; -import s from './SendButton.module.scss'; -import cn from 'classnames'; import Send from '@components/icons/Send'; const SendButton: FC<ButtonHTMLAttributes<HTMLButtonElement>> = (props) => { @@ -8,7 +6,15 @@ const SendButton: FC<ButtonHTMLAttributes<HTMLButtonElement>> = (props) => { <button data-testid='textarea-send-button' {...props} - className={cn(props.className, s.root, 'disabled:cursor-not-allowed')} + className={` + cursor-pointer outline-none border-none + flex items-center + text-primary text-base font-bold + disabled:text-red disabled:cursor-not-allowed + [&_svg]:fill-primary [&_path]:fill-primary + disabled:[&_svg]:fill-red disabled:[&_path]:fill-red + ${props.className || ''} + `} > <span className='mr-1'> <Send /> diff --git a/src/components/common/ChannelChat/UserTextArea/UserTextArea.module.scss b/src/components/common/ChannelChat/UserTextArea/UserTextArea.module.scss deleted file mode 100644 index 75be9cdcc277b680782a411bef52a8b387a618f4..0000000000000000000000000000000000000000 --- a/src/components/common/ChannelChat/UserTextArea/UserTextArea.module.scss +++ /dev/null @@ -1,33 +0,0 @@ -.textArea { - height: 100%; - position: relative; - - ::placeholder { - color: #73767c; - } - - .muted::placeholder { - color: var(--red); - } - - .button { - position: absolute; - right: 0.5rem; - bottom: 0.3rem; - } -} - -.error { - position: absolute; - left: 0.7rem; - bottom: 0.3rem; - color: var(--red); -} - -.editorWrapper { - height: 100%; - border-radius: 5px; - padding: 0.2rem; - position: relative; - padding-bottom: 2rem; -} diff --git a/src/components/common/ChannelChat/UserTextArea/UserTextArea.tsx b/src/components/common/ChannelChat/UserTextArea/UserTextArea.tsx index 968fa9d84a25862a6fd0c77811b6d8e7031234cb..b7c4c0ad3de296b71c47b26a14b59555b50d100d 100644 --- a/src/components/common/ChannelChat/UserTextArea/UserTextArea.tsx +++ b/src/components/common/ChannelChat/UserTextArea/UserTextArea.tsx @@ -1,6 +1,6 @@ -import { default as ReactQuill, ReactQuillProps } from 'react-quill'; -import { Quill, RangeStatic, StringMap } from 'quill'; -import type { QuillAutoDetectUrlOptions } from 'quill-auto-detect-url'; +import Quill from 'quill'; +import type { Range } from 'quill'; +import { Mention, MentionBlot } from 'quill-mention'; import React, { FC, useEffect, @@ -10,42 +10,40 @@ import React, { useRef, HTMLAttributes } from 'react'; -import cn from 'classnames'; -import dynamic from 'next/dynamic'; import EventEmitter from 'events'; import { Tooltip } from 'react-tooltip'; import { useTranslation } from 'react-i18next'; import { useNetworkClient } from 'src/contexts/network-client-context'; import { useUI } from 'src/contexts/ui-context'; -import s from './UserTextArea.module.scss'; + import SendButton from '../SendButton'; import * as app from 'src/store/app'; import * as messages from 'src/store/messages'; import { userIsMuted } from 'src/store/selectors'; import { useAppDispatch, useAppSelector } from 'src/store/hooks'; -import Spinner from 'src/components/common/Spinner'; -import { deflate } from 'src/utils/index'; +import { deflate } from 'src/utils/compression'; import { MESSAGE_TAGS_LIMIT } from 'src/constants'; -import X from '@components/icons/X'; -import Identity from '@components/common/Identity'; +import X from 'src/components/icons/X'; +import Identity from 'src/components/common/Identity'; import { replyingToMessage } from 'src/store/selectors'; -import { EmojiPicker } from '@components/common/EmojiPortal'; -import AtSign from '@components/icons/AtSign'; -import RTF from '@components/icons/RTF'; +import { EmojiPortal, EmojiPicker } from 'src/components/common/EmojiPortal'; + +import AtSign from 'src/components/icons/AtSign'; +import RTF from 'src/components/icons/RTF'; import { useOnClickOutside, useToggle } from 'usehooks-ts'; -import Bold from '@components/icons/Bold'; -import Italics from '@components/icons/Italics'; -import Strikethrough from '@components/icons/Strikethrough'; -import LinkIcon from '@components/icons/Link'; -import OrderedList from '@components/icons/OrderedList'; -import BulletList from '@components/icons/BulletList'; -import Blockquote from '@components/icons/Blockquote'; -import Code from '@components/icons/Code'; -import CodeBlock from '@components/icons/CodeBlock'; -import Input from '@components/common/Input'; -import Button from '@components/common/Button'; +import Bold from 'src/components/icons/Bold'; +import Italics from 'src/components/icons/Italics'; +import Strikethrough from 'src/components/icons/Strikethrough'; +import LinkIcon from 'src/components/icons/Link'; +import OrderedList from 'src/components/icons/OrderedList'; +import BulletList from 'src/components/icons/BulletList'; +import Blockquote from 'src/components/icons/Blockquote'; +import Code from 'src/components/icons/Code'; +import CodeBlock from 'src/components/icons/CodeBlock'; +import Input from 'src/components/common/Input'; +import Button from 'src/components/common/Button'; import useInput from 'src/hooks/useInput'; export const bus = new EventEmitter(); @@ -64,36 +62,21 @@ const extractTagsFromMessage = (message: string) => { }; const ToolbarButton: FC< - Omit<HTMLAttributes<HTMLButtonElement>, 'active'> & { active?: boolean } -> = (props) => ( + Omit<HTMLAttributes<HTMLButtonElement>, 'active'> & { active?: boolean | undefined } +> = ({ active, className, ...props }) => ( <button {...props} - className={cn( - props.className, - { - 'bg-charcoal-3-20 text-primary': props.active - }, - 'text-charcoal-1 p-1 rounded-full hover:bg-charcoal-3-20 hover:text-primary leading-none' - )} + className={`${className || ''} ${ + active + ? 'bg-charcoal-3-20 text-primary' + : 'text-charcoal-1 p-1 rounded-full hover:bg-charcoal-3-20 hover:text-primary leading-none' + }`} + data-active={active} > {props.children} </button> ); -const Editor = dynamic( - async () => { - const { default: RQ } = await import('react-quill'); - - return ({ - forwardedRef, - ...props - }: ReactQuillProps & { forwardedRef: React.LegacyRef<ReactQuill> }) => ( - <RQ {...props} ref={forwardedRef} /> - ); - }, - { ssr: false, loading: () => <Spinner /> } -); - type Props = { className: string; }; @@ -107,7 +90,10 @@ type CustomToolbarProps = { const useCurrentFormats = (quill: Quill) => { const [selection, setSelection] = useState(quill.getSelection()); - const formats = useMemo(() => selection && quill.getFormat(selection), [quill, selection]); + const formats = useMemo(() => { + if (!selection) return null; + return quill.getFormat(selection) as QuillFormats; + }, [quill, selection]); useEffect(() => { const onSelectionChange = () => { @@ -122,19 +108,20 @@ const useCurrentFormats = (quill: Quill) => { }, [quill]); const toggle = useCallback( - (format: string, value?: string) => { + (format: keyof QuillFormats, value?: any) => { + if (!quill || !selection) return; + if (format === 'list' && value === 'ordered') { if (formats?.list) { - quill.format(format, false); + quill.format('list', false, 'user'); } else { - quill.formatLine(selection?.index ?? 0, selection?.length ?? 0, 'list', 'ordered'); + quill.formatLine(selection.index, selection.length, 'list', 'ordered', 'user'); } } else { - quill.format(format, value !== undefined ? value : !formats?.[format]); + quill.format(String(format), value ?? !formats?.[format], 'user'); } - setSelection(quill.getSelection()); }, - [formats, quill, selection?.index, selection?.length] + [formats, quill, selection] ); return { @@ -144,12 +131,32 @@ const useCurrentFormats = (quill: Quill) => { }; }; +// Update the types at the top +interface QuillFormats { + bold?: boolean; + italic?: boolean; + strike?: boolean; + link?: boolean; + blockquote?: boolean; + code?: boolean; + 'code-block'?: boolean; + list?: boolean | 'ordered' | 'list'; + [key: string]: unknown; +} + +interface QuillRange { + index: number; + length: number; +} + +type Sources = 'user' | 'api' | 'silent'; + const CustomToolbar: FC<CustomToolbarProps> = ({ className, quill }) => { const { t } = useTranslation(); const { formats, selection, toggle } = useCurrentFormats(quill); const [linkMenuOpened, setLinkMenuOpened] = useState(false); const [linkInput, onLinkInputChanged, linkInputControls] = useInput(); - const [savedSelection, setSavedSelection] = useState<RangeStatic | null>(null); + const [savedSelection, setSavedSelection] = useState<QuillRange | null>(null); const linkMenuRef = useRef<HTMLDivElement>(null); useOnClickOutside(linkMenuRef, () => { @@ -176,12 +183,12 @@ const CustomToolbar: FC<CustomToolbarProps> = ({ className, quill }) => { const onLinkClicked = useCallback(() => { if (!formats?.link) { const text = quill.getText(selection?.index ?? 0, selection?.length ?? 0); - quill.format('link', text); + quill.format('link', text, 'user'); saveSelection(); - linkInputControls.set(text); + linkInputControls.set(text || ''); setLinkMenuOpened(true); } else { - quill.format('link', false); + quill.format('link', false, 'user'); } }, [formats?.link, linkInputControls, quill, saveSelection, selection?.index, selection?.length]); @@ -218,7 +225,7 @@ const CustomToolbar: FC<CustomToolbarProps> = ({ className, quill }) => { const link = currentFormats?.link; if (link) { setLinkMenuOpened(true); - linkInputControls.set(link); + linkInputControls.set(link as string); } else { setLinkMenuOpened(false); } @@ -232,7 +239,7 @@ const CustomToolbar: FC<CustomToolbarProps> = ({ className, quill }) => { }, [linkInputControls, quill, quill.root]); return ( - <div className={cn(className, 'px-2 pt-2 space-x-2')}> + <div className={`${className || ''} px-2 pt-2 space-x-2`}> <ToolbarButton active={formats?.bold} onClick={() => { @@ -286,10 +293,11 @@ const CustomToolbar: FC<CustomToolbarProps> = ({ className, quill }) => { <div ref={linkMenuRef} onMouseDown={saveSelection} - className={cn( - { hidden: !linkMenuOpened }, - 'flex w-[25rem] items-center space-x-2 absolute bottom-[100%] bg-charcoal-4-80 backdrop-blur-lg rounded-xl p-4' - )} + className={`${ + linkMenuOpened + ? 'flex w-[25rem] items-center space-x-2 absolute bottom-[100%] bg-charcoal-4-80 backdrop-blur-lg rounded-xl p-4' + : 'hidden' + }`} > <span>{t('Link:')}</span> <div className='relative flex-grow'> @@ -338,7 +346,7 @@ const CustomToolbar: FC<CustomToolbarProps> = ({ className, quill }) => { CTRL/CMD + SHIFT + 8 </Tooltip> <ToolbarButton - active={formats?.list === 'bullet'} + active={formats?.list === 'list'} onClick={() => toggle('list')} id='unordered-list-button' className='ql-list' @@ -386,6 +394,32 @@ const CustomToolbar: FC<CustomToolbarProps> = ({ className, quill }) => { // so we're instantiating a reference outside of the component, lol let atMentions: { id: string; value: string }[] = []; +// Add these types at the top +interface KeyBinding { + key: string; + shortKey?: boolean; + shiftKey?: boolean; + altKey?: boolean; + metaKey?: boolean; + ctrlKey?: boolean; + handler(range: { index: number; length: number }): void; +} + +interface KeyBindings { + [key: string]: KeyBinding; +} + +// Add this interface for keyboard bindings +interface NormalizedBinding { + key: string; + shortKey?: boolean; + shiftKey?: boolean; + altKey?: boolean; + metaKey?: boolean; + ctrlKey?: boolean; + handler(this: { quill: Quill }, range: Range): void; +} + const UserTextArea: FC<Props> = ({ className }) => { const replyToMessage = useAppSelector(replyingToMessage); const { t } = useTranslation(); @@ -402,7 +436,6 @@ const UserTextArea: FC<Props> = ({ className }) => { const isMuted = useAppSelector(userIsMuted); const { openModal, setModalView } = useUI(); const { cmix, sendMessage, sendReply } = useNetworkClient(); - const [editorLoaded, setEditorLoaded] = useState(false); const message = useAppSelector(app.selectors.messageDraft(channelId ?? '')); const deflatedContent = useMemo(() => deflate(message), [message]); const messageIsUnderLimit = useMemo( @@ -425,87 +458,235 @@ const UserTextArea: FC<Props> = ({ className }) => { const isMac = navigator?.userAgent.indexOf('Mac') !== -1; return isMac ? { metaKey: true } : { ctrlKey: true }; }, []); - const editorRef = useRef<ReactQuill>(null); + const [quill, setQuill] = useState<Quill | null>(null); + const containerRef = useRef<HTMLDivElement>(null); const [toolbarEnabled, toggleToolbar] = useToggle(); - const insertEmoji = useCallback((emoji: string) => { - const quill = editorRef.current?.editor; - if (!quill) { - return; - } - const { index, length } = quill.getSelection(true); - quill.deleteText(index, length); - quill.insertEmbed(index, 'emoji', emoji, 'user'); - setTimeout(() => quill.setSelection(index + emoji.length, 0), 0); - }, []); - - const insertMention = useCallback(() => { - const quill = editorRef.current?.editor; - if (!quill) { - return; - } - const mention = quill.getModule('mention'); - - mention.openMenu('@'); - }, []); + // Update formats array to match registered formats + const formats = useMemo( + () => [ + 'bold', + 'italic', + 'underline', + 'strike', + 'blockquote', + 'list', + 'mention', + 'link', + 'code', + 'code-block' + ], + [] + ); - const loadQuillModules = useCallback(async () => { - await import('quill-mention'); - const QuillInstance = (await import('react-quill')).default.Quill; - const DetectUrl = (await import('quill-auto-detect-url')).default; - const ShortNameEmoji = (await import('src/quill/ShortNameEmoji')).default; - const Link = QuillInstance.import('formats/link'); - const icons = QuillInstance.import('ui/icons'); - const EmojiBlot = (await import('src/quill/EmojiBlot')).default; + const emojiIcon = "<svg class='i' viewBox='0 0 24 24'><use href='#emoticon-happy'></use></svg>"; + // Update modules configuration + const modules = useMemo( + () => ({ + toolbar: false, + keyboard: { + bindings: [ + { + key: 'X', + shiftKey: true, + ...(ctrlOrCmd.metaKey ? { metaKey: true } : { ctrlKey: true }), + handler(this: { quill: Quill }, range: Range) { + const format = this.quill.getFormat(range) as QuillFormats; + this.quill.format('strike', !format.strike, 'user'); + } + }, + { + key: 'Enter', + handler() { + enterEvent(); + return false; + } + }, + { + key: '7', + shiftKey: true, + ...(ctrlOrCmd.metaKey ? { metaKey: true } : { ctrlKey: true }), + handler(range: { index: number; length: number }) { + const format = this.quill.getFormat(range.index, range.length); + if (format.list) { + this.quill.format('list', false, 'user'); + } else { + this.quill.format('list', 'ordered', 'user'); + } + } + }, + { + key: '8', + shiftKey: true, + ...(ctrlOrCmd.metaKey ? { metaKey: true } : { ctrlKey: true }), + handler: function (this: { quill: Quill }, range: Range) { + const format = this.quill.getFormat(range); + this.quill.format('list', !format.list); + } + }, + { + key: 'C', + shiftKey: true, + ...(ctrlOrCmd.metaKey ? { metaKey: true } : { ctrlKey: true }), + handler: function (this: { quill: Quill }, range: Range) { + const format = this.quill.getFormat(range); + this.quill.format('code', !format.code); + } + }, + { + key: 'C', + shiftKey: true, + altKey: true, + ...(ctrlOrCmd.metaKey ? { metaKey: true } : { ctrlKey: true }), + handler: function (this: { quill: Quill }, range: Range) { + const format = this.quill.getFormat(range); + this.quill.format('code-block', !format['code-block']); + } + }, + { + key: '9', + shiftKey: true, + ...(ctrlOrCmd.metaKey ? { metaKey: true } : { ctrlKey: true }), + handler: function (this: { quill: Quill }, range: Range) { + const format = this.quill.getFormat(range); + this.quill.format('blockquote', !format.blockquote); + } + }, + { + key: 'U', + shiftKey: false, + ...(ctrlOrCmd.metaKey ? { metaKey: true } : { ctrlKey: true }), + handler: function (this: { quill: Quill }, range: Range) { + const format = this.quill.getFormat(range); + this.quill.format('link', !format.link); + } + } + ] as NormalizedBinding[] + }, + clipboard: { + matchVisual: false + }, + autoDetectUrl: { + urlRegularExpression: /(https?:\/\/|www\.)[\w-.]+\.[\w-.]+[\S]+/i + }, + mention: { + allowedChars: /^[A-Za-z\s]*$/, + mentionDenotationChars: ['@'], + source( + searchTerm: string, + renderList: (values: { id: string; value: string }[], search: string) => void + ) { + const matches = atMentions.filter((v) => + v.value.toLowerCase().includes(searchTerm.toLowerCase()) + ); + renderList(matches, searchTerm); + }, + renderItem(item: { id: string; value: string }) { + return `<div>${item.value}</div>`; + } + } + }), + [ctrlOrCmd] + ); - icons['code-block'] = - "<svg data-tml='true' aria-hidden='true' viewBox='0 0 20 20'><path fill='currentColor' fillRule='evenodd' d='M9.212 2.737a.75.75 0 1 0-1.424-.474l-2.5 7.5a.75.75 0 0 0 1.424.474l2.5-7.5Zm6.038.265a.75.75 0 0 0 0 1.5h2a.25.25 0 0 1 .25.25v11.5a.25.25 0 0 1-.25.25h-13a.25.25 0 0 1-.25-.25v-3.5a.75.75 0 0 0-1.5 0v3.5c0 .966.784 1.75 1.75 1.75h13a1.75 1.75 0 0 0 1.75-1.75v-11.5a1.75 1.75 0 0 0-1.75-1.75h-2Zm-3.69.5a.75.75 0 1 0-1.12.996l1.556 1.753-1.556 1.75a.75.75 0 1 0 1.12.997l2-2.248a.75.75 0 0 0 0-.996l-2-2.252ZM3.999 9.06a.75.75 0 0 1-1.058-.062l-2-2.248a.75.75 0 0 1 0-.996l2-2.252a.75.75 0 1 1 1.12.996L2.504 6.251l1.557 1.75a.75.75 0 0 1-.062 1.06Z' clipRule='evenodd'></path></svg>"; - Link.PROTOCOL_WHITELIST = ['http', 'https', 'mailto', 'tel', 'radar', 'rdar', 'smb', 'sms']; + // Initialize Quill + useEffect(() => { + // Only initialize if we have a container and haven't initialized quill yet + if (!containerRef.current) return; - class CustomLinkSanitizer extends Link { - static sanitize(url: string) { - const sanitizedUrl = super.sanitize(url); + const initQuill = async () => { + if (quill) return; + try { + const [{ default: DetectUrl }] = await Promise.all([import('quill-auto-detect-url')]); - if (!sanitizedUrl || sanitizedUrl === 'about:blank') return sanitizedUrl; + // Only register if not already registered + if (!Quill.imports['blots/mention']) { + Quill.register('blots/mention', MentionBlot); + } + if (!Quill.imports['modules/mention']) { + Quill.register('modules/mention', Mention); + } + if (!Quill.imports['modules/autoDetectUrl']) { + Quill.register('modules/autoDetectUrl', DetectUrl, true); + } - const hasWhitelistedProtocol = this.PROTOCOL_WHITELIST.some((protocol: string) => - sanitizedUrl?.startsWith(protocol) - ); + // Create Quill instance + const quillInstance = new Quill(containerRef.current as HTMLElement, { + theme: 'snow', + modules: modules, + formats: formats, + placeholder: placeholder, + readOnly: false, + bounds: containerRef.current + }); + + setQuill(quillInstance); + } catch (error) { + console.error('Error initializing Quill:', error); + } + }; - if (hasWhitelistedProtocol) return sanitizedUrl; + // Initialize Quill + initQuill(); + }, []); - return `https://${sanitizedUrl}`; + const insertEmoji = useCallback( + (emoji: string) => { + if (!quill) { + console.error('No quill instance found when inserting emoji'); + return; } - } - - QuillInstance.register('formats/emoji', EmojiBlot); - QuillInstance.register('modules/shortNameEmoji', ShortNameEmoji); - QuillInstance.register(CustomLinkSanitizer, true); - QuillInstance.register('modules/autoDetectUrl', DetectUrl); + const { index, length } = quill.getSelection(true); + console.log('insertEmoji', emoji, index, length); + quill.deleteText(index, length); + quill.insertText(index, emoji); + quill.setSelection(index + emoji.length, 0); // Move cursor after emoji + }, + [quill] + ); - setEditorLoaded(true); - }, []); + const insertMention = useCallback(() => { + if (!quill) { + console.error('No quill instance found when inserting mention'); + return; + } + const mention = quill.getModule('mention') as Mention; - useEffect(() => { - loadQuillModules(); - }, [loadQuillModules]); + mention.openMenu('@'); + }, [quill]); const resetEditor = useCallback(() => { if (channelId) { dispatch(app.actions.clearMessageDraft(channelId)); } - }, [channelId, dispatch]); + quill?.setText(''); + }, [channelId, dispatch, quill]); const updateMessage = useCallback( (text: string) => { if (channelId) { const trimmed = text === '<p><br></p>' ? '' : text; + console.log('updateMessage', trimmed); dispatch(app.actions.updateMessageDraft({ channelId, text: trimmed })); } }, [channelId, dispatch] ); + useEffect(() => { + if (!quill) { + return; + } + quill.on('text-change', (_delta: unknown, _oldDelta: unknown, source: Sources) => { + if (source === 'user' && updateMessage) { + const html = quill.root.innerHTML; + if (html !== message) { + updateMessage(html); + } + } + }); + }, [quill, updateMessage]); + const sendCurrentMessage = useCallback(async () => { if (cmix && cmix.ReadyToSend && !cmix.ReadyToSend()) { setModalView('NETWORK_NOT_READY'); @@ -518,6 +699,10 @@ const UserTextArea: FC<Props> = ({ className }) => { } if (message.length === 0 || !messageIsUnderLimit || tooManyTags) { + console.log( + 'sendCurrentMessage cannot send: ', + JSON.stringify({ messageLength: message.length, messageIsUnderLimit, tooManyTags }) + ); return; } @@ -556,196 +741,72 @@ const UserTextArea: FC<Props> = ({ className }) => { }; }, [sendCurrentMessage]); - const modules = useMemo<StringMap>( - () => ({ - toolbar: false, - shortNameEmoji: true, - autoDetectUrl: { - urlRegularExpression: /(https?:\/\/|www\.)[\w-.]+\.[\w-.]+[\S]+/i - } as QuillAutoDetectUrlOptions, - mention: { - allowedChars: /^[A-Za-z]*$/, - mentionDenotationChars: ['@'], - source: function ( - searchTerm: string, - renderList: (values: { id: string; value: string }[], search: string) => void - ) { - const matches = atMentions.filter((v) => - v.value.toLocaleLowerCase().startsWith(searchTerm.toLocaleLowerCase()) - ); - renderList(matches, searchTerm); - } - }, - keyboard: { - bindings: { - strike: { - ...ctrlOrCmd, - key: 'X', - shiftKey: true, - handler: function (this: { quill: Quill }, range: RangeStatic) { - const format = this.quill.getFormat(range); - this.quill.format('strike', !format.strike); - } - }, - enter: { - key: 'Enter', - handler: () => { - enterEvent(); - } - }, - listOrdered: { - ...ctrlOrCmd, - key: '7', - shiftKey: true, - handler: function (this: { quill: Quill }, range: RangeStatic) { - const format = this.quill.getFormat(range); - if (format.list) { - this.quill.format('list', false); - } else { - this.quill.formatLine(range.index, range.length, 'list', 'ordered'); - } - } - }, - list: { - ...ctrlOrCmd, - key: '8', - shiftKey: true, - handler: function (this: { quill: Quill }, range: RangeStatic) { - const format = this.quill.getFormat(range); - this.quill.format('list', !format.list); - } - }, - code: { - ...ctrlOrCmd, - key: 'C', - shiftKey: true, - handler: function (this: { quill: Quill }, range: RangeStatic) { - const format = this.quill.getFormat(range); - this.quill.format('code', !format.code); - } - }, - codeblock: { - ...ctrlOrCmd, - key: 'C', - shiftKey: true, - altKey: true, - handler: function (this: { quill: Quill }, range: RangeStatic) { - const format = this.quill.getFormat(range); - this.quill.format('code-block', !format['code-block']); - } - }, - blockquote: { - ...ctrlOrCmd, - key: '9', - shiftKey: true, - handler: function (this: { quill: Quill }, range: RangeStatic) { - const format = this.quill.getFormat(range); - this.quill.format('blockquote', !format.blockquote); - } - }, - link: { - ...ctrlOrCmd, - key: 'U', - shiftKey: false, - handler: function (this: { quill: Quill }, range: RangeStatic) { - const format = this.quill.getFormat(range); - this.quill.format('link', !format.link); - } - } - } - } - }), - [ctrlOrCmd] - ); - - const formats = useMemo( - () => [ - 'bold', - 'italic', - 'underline', - 'strike', - 'blockquote', - 'list', - 'bullet', - 'link', - 'code', - 'code-block', - 'mention', - 'emoji' - ], - [] - ); - return ( - <div className={cn('relative bg-charcoal-4-80 p-2', s.textArea, className)}> - {replyToMessage && replyMessageMarkup && ( - <div className='flex justify-between mb-3 items-center'> - <div className={s.replyHeader}> - {t('Replying to')} - <Identity className='text-charcoal-3-important' {...replyToMessage} /> + <EmojiPortal> + <div className={`relative bg-charcoal-4-80 p-2 ${className || ''}`}> + {replyToMessage && replyMessageMarkup && ( + <div className='flex justify-between mb-3 items-center'> + <div className='text-charcoal-1'> + {t('Replying to')} + <Identity className='text-charcoal-3' {...replyToMessage} /> + </div> + <button className='hover:bg-charcoal-3-20 hover:text-primary p-2 rounded-full'> + <X + className='w-5 h-5' + onClick={() => { + dispatch(app.actions.replyTo(undefined)); + }} + /> + </button> </div> - <button className='hover:bg-charcoal-3-20 hover:text-primary p-2 rounded-full'> - <X - className='w-5 h-5' - onClick={() => { - dispatch(app.actions.replyTo(undefined)); - }} - /> + )} + <div className='flex items-end'> + <button + onClick={toggleToolbar} + className='p-1 text-charcoal-1 -ml-1 mr-0.5 rounded-full hover:bg-charcoal-3-20 leading-none hover:text-primary' + > + <RTF className='w-6 h-6' /> </button> - </div> - )} - <div className='flex items-end'> - <button - onClick={toggleToolbar} - className='p-1 text-charcoal-1 -ml-1 mr-0.5 rounded-full hover:bg-charcoal-3-20 leading-none hover:text-primary' - > - <RTF className='w-6 h-6' /> - </button> - <div className='rounded-2xl bg-near-black flex-grow'> - {editorLoaded && editorRef.current?.editor && ( - <CustomToolbar - quill={editorRef.current.editor} - className={cn({ - hidden: !toolbarEnabled - })} - /> - )} - <div className='flex'> - {editorLoaded && ( - <Editor - className={cn('flex-grow', { 'text-red': isMuted })} - forwardedRef={editorRef} - id='editor' - preserveWhitespace - value={message} - theme='snow' - formats={formats} - modules={modules} - onChange={updateMessage} - placeholder={placeholder} - /> - )} - <div className='px-1 flex items-center'> - <ToolbarButton - onClick={insertMention} - className='text-charcoal-1 p-1 rounded-full hover:bg-charcoal-3-20 leading-none hover:text-primary' - > - <AtSign className='w-6 h-6' /> - </ToolbarButton> - <ToolbarButton> - <EmojiPicker className='w-6 h-6' onSelect={insertEmoji} /> - </ToolbarButton> + <div className='rounded-2xl bg-near-black flex-grow w-full'> + {quill && <CustomToolbar quill={quill} className={toolbarEnabled ? '' : 'hidden'} />} + <div className='flex w-full'> + <div className='flex-grow'> + <div className={`w-full`}> + <div ref={containerRef} className='w-full'> + <div className='editor-container' /> + </div> + </div> + </div> + <div className='px-1 flex items-center flex-shrink-0'> + <ToolbarButton + onClick={insertMention} + className='text-charcoal-1 p-1 rounded-full hover:bg-charcoal-3-20 leading-none hover:text-primary' + > + <AtSign className='w-6 h-6' /> + </ToolbarButton> + <ToolbarButton> + <EmojiPicker onSelect={insertEmoji} /> + </ToolbarButton> + </div> </div> </div> + {tooManyTags && ( + <div className='text-red text-sm absolute bottom-full left-0 mb-1'> + {t('Too many tags.')} + </div> + )} + {!messageIsUnderLimit && ( + <div className='text-red text-sm absolute bottom-full left-0 mb-1'> + {t('Message is too long.')} + </div> + )} + <SendButton + disabled={!messageIsUnderLimit || tooManyTags || isMuted} + onClick={sendCurrentMessage} + /> </div> - {tooManyTags && <div className={s.error}>{t('Too many tags.')}</div>} - {!messageIsUnderLimit && <div className={s.error}>{t('Message is too long.')}</div>} - <SendButton - disabled={!messageIsUnderLimit || tooManyTags || isMuted} - onClick={sendCurrentMessage} - /> </div> - </div> + </EmojiPortal> ); }; diff --git a/src/components/common/ChannelHeader/index.tsx b/src/components/common/ChannelHeader/index.tsx index 269d9ea06a75c0f05dcef475a59793e0bca16ee0..69e0da3187941dda6be7b0f14ed803548b64e1aa 100644 --- a/src/components/common/ChannelHeader/index.tsx +++ b/src/components/common/ChannelHeader/index.tsx @@ -16,7 +16,7 @@ import * as channels from 'src/store/channels'; import * as app from 'src/store/app'; import useChannelFavorites from 'src/hooks/useChannelFavorites'; -import { ChannelNotificationLevel, DMNotificationLevel, NotificationStatus } from '@types'; +import { ChannelNotificationLevel, DMNotificationLevel, NotificationStatus } from 'src/types'; import Dropdown, { DropdownItem } from '../Dropdown'; import Notice from '@components/icons/Notice'; import Share from '@components/icons/Share'; @@ -27,8 +27,6 @@ import Block from '@components/icons/Block'; import useDmClient from 'src/hooks/useDmClient'; import NotificationsIcon from '@components/icons/Notifications'; import { Pin } from '@components/icons'; - -import s from './styles.module.scss'; import ChannelBadges from '../ChannelBadges'; import Contributors from '@components/icons/Contributors'; import Keys from '@components/icons/Keys'; @@ -42,25 +40,36 @@ type Props = Omit<Channel, 'name' | 'description' | 'currentPage'> & { name: React.ReactNode; }; -const HeaderMenuItem: FC< - HTMLAttributes<HTMLButtonElement> & { notification?: boolean; active?: boolean } -> = (props) => ( +type HeaderMenuItemProps = Omit<HTMLAttributes<HTMLButtonElement>, 'active'> & { + notification?: boolean; + active?: boolean; + onClick?: () => void; + title?: string; +}; + +const HeaderMenuItem: FC<HeaderMenuItemProps> = ({ + notification, + active, + children, + className, + onClick, + title, + ...otherProps // exclude any other props we don't want to pass to button +}) => ( <li className='list-none'> <button - {...props} - className={cn( - 'cursor-pointer relative w-8 h-8 p-1 hover:text-primary hover:bg-charcoal-3-20 rounded-full', - props.className, - { - 'text-primary': props.active, - 'text-charcoal-1': !props.active - } - )} + onClick={onClick} + title={title} + type='button' + className={` + cursor-pointer relative w-8 h-8 p-1 + hover:text-primary hover:bg-charcoal-3-20 rounded-full + ${active ? 'text-primary' : 'text-charcoal-1'} + ${className || ''} + `} > - {props.children} - {props.notification && ( - <div className='rounded-full w-2 h-2 absolute bottom-1 right-1 bg-red' /> - )} + {children} + {notification && <div className='rounded-full w-2 h-2 absolute bottom-1 right-1 bg-red' />} </button> </li> ); @@ -94,7 +103,9 @@ const ChannelHeader: FC<Props> = ({ id, isAdmin, name, privacyLevel }) => { }, [currentChannel, openModal, setModalView]); const toggleDMNotifications = useCallback(() => { - assert(conversationId, 'Conversation ID required to set notification level'); + if (!conversationId) { + throw new Error('Conversation ID required to set notification level'); + } toggleDmNotificationLevel(conversationId); }, [toggleDmNotificationLevel, conversationId]); @@ -118,23 +129,23 @@ const ChannelHeader: FC<Props> = ({ id, isAdmin, name, privacyLevel }) => { }, [channelManager, channelNotificationLevel, currentChannel?.id, utils]); return ( - <div data-testid='channel-header' className={cn('flex w-full', s.root)}> + <div data-testid='channel-header' className='flex w-full px-4 py-2'> <label htmlFor='mobileToggle' - className={ - 'flex-none flex items-center text-xl cursor-pointer transition-colors ease-in duration-300 mr-4 hover:text-text-secondary md:hidden' - } + className='flex-none flex items-center text-xl cursor-pointer transition-colors ease-in duration-300 mr-4 hover:text-text-secondary md:hidden' > ← </label> <div className='flex-1 min-w-0'> - <div data-testid='channel-name' className={cn(s.channelName, 'truncate')}> + <div data-testid='channel-name' className='text-text-primary font-medium text-lg truncate'> {name} </div> <div className='flex'> - <div className={cn(s.channelId, 'flex space-x-2 truncate')}> + <div className='flex space-x-2 truncate'> <ChannelBadges privacyLevel={privacyLevel} isAdmin={isAdmin} /> - <span className={cn(s.channelId, 'truncate')}>ID: {id}</span> + <span className='text-charcoal-1 mt-0.5 text-[0.6875rem] font-normal tracking-[0.0275rem] whitespace-nowrap truncate'> + ID: {id} + </span> </div> </div> </div> diff --git a/src/components/common/ChannelHeader/styles.module.scss b/src/components/common/ChannelHeader/styles.module.scss deleted file mode 100644 index 8f3dc5c0a6ea75ed088d25365f607043c0a7a546..0000000000000000000000000000000000000000 --- a/src/components/common/ChannelHeader/styles.module.scss +++ /dev/null @@ -1,34 +0,0 @@ -.root { - padding: 0.5rem 1rem; - - .channelName { - color: var(--text-primary); - font-weight: 500; - font-size: 1.125rem; - line-height: normal; - font-style: normal; - } - - .channelId { - color: var(--charcoal-1); - margin-top: 0.2rem; - font-size: 0.6875rem; - font-style: normal; - font-weight: 400; - line-height: normal; - letter-spacing: 0.0275rem; - flex-wrap: none; - white-space: nowrap; - } -} - -.icon { - width: 1.5rem; - height: 1.5rem; - color: var(--charcoal-1); - cursor: pointer; -} - -.gold { - color: var(--primary); -} diff --git a/src/components/common/CheckboxToggle/index.tsx b/src/components/common/CheckboxToggle/index.tsx index 5f01b9dbf32bbb2804932da8560f536428100b4a..da4cca99374a891b0b982136cbeccc8b9ffd860f 100644 --- a/src/components/common/CheckboxToggle/index.tsx +++ b/src/components/common/CheckboxToggle/index.tsx @@ -1,7 +1,5 @@ import React, { InputHTMLAttributes, FC } from 'react'; -import cn from 'classnames'; - type Props = InputHTMLAttributes<HTMLInputElement>; const CheckboxToggle: FC<Props> = (props) => ( @@ -11,9 +9,29 @@ const CheckboxToggle: FC<Props> = (props) => ( type='checkbox' checked {...props} - className={cn(props.className, 'sr-only peer')} + className={`sr-only peer ${props.className || ''}`} + /> + <div + className={` + w-11 h-6 rounded-full + border border-charcoal-1 bg-near-black + transition-all + peer-checked:bg-primary + after:content-[''] + after:absolute + after:top-0.5 + after:left-[2px] + after:bg-primary + after:border-charcoal-1 + after:rounded-full + after:h-5 + after:w-5 + after:transition-all + peer-checked:after:translate-x-full + peer-checked:after:bg-near-black + peer-checked:after:border-white + `} /> - <div className="w-11 h-6 rounded-full peer peer-checked:after:translate-x-full border border-charcoal-1 bg-near-black peer-checked:bg-primary peer-checked:after:border-white after:content-[''] after:absolute after:top-0.5 after:left-[2px] after:bg-near-black after:border-charcoal-1 after:rounded-full after:bg-primary peer-checked:after:bg-near-black after:h-5 after:w-5 after:transition-all transition-all"></div> </label> ); diff --git a/src/components/common/CheckboxToggle/style.module.scss b/src/components/common/CheckboxToggle/style.module.scss deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/src/components/common/Collapse/Collapse.module.scss b/src/components/common/Collapse/Collapse.module.scss deleted file mode 100644 index 5b9a12cd0ee1a6007e2cfe49c83df2bbfc87f77c..0000000000000000000000000000000000000000 --- a/src/components/common/Collapse/Collapse.module.scss +++ /dev/null @@ -1,26 +0,0 @@ -.root { - @apply flex flex-col outline-none; -} - -.header { - @apply flex flex-row items-center; - color: var(--grey); -} - -.content { - @apply pt-3 overflow-hidden; -} - -.icon { - @apply mr-1; - transition: transform 0.2s ease; -} - -.icon.open { - transform: rotate(90deg); -} - -.label { - display: block; - width: 100%; -} diff --git a/src/components/common/Collapse/Collapse.tsx b/src/components/common/Collapse/Collapse.tsx index 1b0445f0d9df4c2c563f63836d3bf6b3b53b852a..d6bafe9d22c13db734c2a31303fc6542a349ba65 100644 --- a/src/components/common/Collapse/Collapse.tsx +++ b/src/components/common/Collapse/Collapse.tsx @@ -1,9 +1,7 @@ -import cn from 'classnames'; import React, { FC, ReactNode, useState } from 'react'; import { useSpring, a } from '@react-spring/web'; import useMeasure from 'react-use-measure'; import { ResizeObserver } from '@juggle/resize-observer'; -import s from './Collapse.module.scss'; import { ArrowDown, ArrowUp } from 'src/components/icons'; export interface CollapseProps { @@ -16,18 +14,32 @@ export interface CollapseProps { } const Icon = ({ className = '' }: { className?: string }) => { - return <ArrowDown className={cn(s.icon, className)} />; + return ( + <ArrowDown + className={` + mr-1 transition-transform duration-200 ease-in-out + ${className} + `} + /> + ); }; const CloseIcon = ({ className = '' }: { className?: string }) => { - return <ArrowUp className={cn(s.icon, className)} />; + return ( + <ArrowUp + className={` + mr-1 transition-transform duration-200 ease-in-out + ${className} + `} + /> + ); }; const IconTitle = ({ active, title }: { active: boolean; title: CollapseProps['title'] }) => { return ( <> {!active ? <CloseIcon /> : <Icon />} - <span className={s.label}>{title}</span> + <span className='block w-full'>{title}</span> </> ); }; @@ -46,13 +58,19 @@ const Collapse: FC<CollapseProps> = React.memo( }); const toggle = () => setActive((x) => !x); + return ( - <div className={cn(s.root, className)} role='button' tabIndex={0} aria-expanded={isActive}> - <div className={cn(s.header, 'text--sm')} onClick={toggle}> + <div + className={`flex flex-col outline-none ${className}`} + role='button' + tabIndex={0} + aria-expanded={isActive} + > + <div className='flex flex-row items-center text-grey text-sm' onClick={toggle}> <IconTitle active={isActive} title={title} /> </div> <a.div style={{ overflow: 'hidden', ...animProps }}> - <div ref={ref} className={s.content}> + <div ref={ref} className='pt-3 overflow-hidden'> {children} </div> </a.div> diff --git a/src/components/common/DMs/index.tsx b/src/components/common/DMs/index.tsx index e8bd93ad4cd54ee77950876801fb4b3dcaeecf48..e731ac8c064604111ebe21dfd6a549986cbc06ad 100644 --- a/src/components/common/DMs/index.tsx +++ b/src/components/common/DMs/index.tsx @@ -3,16 +3,15 @@ import { Trans, useTranslation } from 'react-i18next'; import cn from 'classnames'; import { useAppDispatch, useAppSelector } from 'src/store/hooks'; +import * as dms from 'src/store/dms'; import * as app from 'src/store/app'; import SearchInput from '../SearchInput'; import useChannelFavorites from 'src/hooks/useChannelFavorites'; -import s from 'src/components/common/Spaces/styles.module.scss'; -import * as dms from 'src/store/dms'; +import Space from '../Spaces/Space'; import Add from 'src/components/icons/Add'; -import { useUI } from 'src/contexts/ui-context'; -import Space from 'src/components/common/Spaces/Space'; -import Identity from '../Identity'; +import { useUI } from '@contexts/ui-context'; import Button from '../Button'; +import Identity from '../Identity'; const DMs = () => { const { t } = useTranslation(); @@ -50,7 +49,7 @@ const DMs = () => { }, [filteredConversations, currentConversation, dispatch, favsLoading]); return ( - <div className={s.root}> + <div className='bg-our-black p-4 pb-8 h-full'> {allConversations.length > 0 && ( <div className='flex items-center relative mb-2'> <SearchInput @@ -71,7 +70,7 @@ const DMs = () => { )} <div className='space-y-1'> {allConversations.length > 0 && filteredConversations.length === 0 && ( - <p className='p-3 text-sm text-orange'> + <p className='p-3 text-sm text-orange'> {t('No conversations found with your search criteria')} </p> )} @@ -90,13 +89,13 @@ const DMs = () => { date={latestMsg?.timestamp} name={<Identity {...convo} />} active={active} - onClick={() => { - selectChannel(convo.pubkey); - }} + onClick={() => selectChannel(convo.pubkey)} /> </label> <hr - className={cn('border-charcoal-4 border-1', { invisible: active || nextActive })} + className={cn('border-charcoal-4 border-1', { + invisible: active || nextActive + })} /> </React.Fragment> ); diff --git a/src/components/common/DropboxButton.tsx b/src/components/common/DropboxButton.tsx deleted file mode 100644 index 4c021f105f29417e33698fa0d879ddd1118c7c4a..0000000000000000000000000000000000000000 --- a/src/components/common/DropboxButton.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import { DropboxAuth } from 'dropbox'; -import { FC, useCallback, useEffect, useMemo } from 'react'; -import { faDropbox } from '@fortawesome/free-brands-svg-icons'; -import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -import { useTranslation } from 'react-i18next'; -import cn from 'classnames'; - -import Button, { Props as ButtonProps } from '@components/common/Button'; -import { AppEvents, appBus } from 'src/events'; - -type Props = Partial<ButtonProps> & { - onStartLoading?: () => void; - password?: string; -}; - -const DropboxButton: FC<Props> = ({ onStartLoading = () => {}, ...props }) => { - const { t } = useTranslation(); - - const auth = useMemo( - () => - new DropboxAuth({ - clientId: process.env.NEXT_PUBLIC_APP_DROPBOX_CLIENT_ID - }), - [] - ); - - const onTokenMessage = useCallback( - (e: MessageEvent) => { - if (window.location.origin === e.origin && e.data.code) { - appBus.emit(AppEvents.DROPBOX_TOKEN, e.data.code); - onStartLoading(); - } - }, - [onStartLoading] - ); - - useEffect(() => { - window.addEventListener('message', onTokenMessage, false); - - return () => window.removeEventListener('message', onTokenMessage); - }, [onStartLoading, onTokenMessage]); - - const onClick = useCallback(async () => { - const redirectUrl = new URL(window.location.href); - redirectUrl.pathname = 'dropbox'; - const url = (await auth.getAuthenticationUrl(redirectUrl.href, undefined, 'token')).toString(); - window.open(url, '_blank', 'width=600,height=700'); - }, [auth]); - - return ( - <Button - {...props} - className={cn('flex justify-center items-center space-x-1')} - onClick={onClick} - > - <FontAwesomeIcon className='w-5 h-5' icon={faDropbox} /> - - {t('Dropbox')} - </Button> - ); -}; - -export default DropboxButton; diff --git a/src/components/common/Dropdown/Dropdown.module.scss b/src/components/common/Dropdown/Dropdown.module.scss deleted file mode 100644 index f42663c786d2fcf9c9e578b372de4e6b32eb941f..0000000000000000000000000000000000000000 --- a/src/components/common/Dropdown/Dropdown.module.scss +++ /dev/null @@ -1,27 +0,0 @@ -.root { - border-radius: 0.75rem; - box-shadow: 0px 8px 25px 0px rgba(0, 0, 0, 0.5); - border-radius: 0.75rem; - border-radius: var(--border-radius); - position: absolute; - padding: 1rem 0rem; - right: 0; - top: 100%; -} - -.item { - display: flex; - padding: 0.5rem 2rem 0.5rem 1rem; - align-items: center; - align-self: stretch; - font-size: 0.875rem; - font-style: normal; - font-weight: 500; - line-height: normal; - letter-spacing: 0.00875rem; - - &:hover { - cursor: pointer; - background-color: var(--charcoal-3); - } -} diff --git a/src/components/common/Dropdown/index.tsx b/src/components/common/Dropdown/index.tsx index 70abea33f65811f41391229022336d398f5fb854..7d52e4161a721eae04ffbe555f0f05ea2a2a02f2 100644 --- a/src/components/common/Dropdown/index.tsx +++ b/src/components/common/Dropdown/index.tsx @@ -1,4 +1,4 @@ -import { WithChildren } from '@types'; +import { WithChildren } from 'src/types'; import React, { FC, HTMLAttributes, @@ -10,9 +10,6 @@ import React, { useRef } from 'react'; import { useOnClickOutside } from 'usehooks-ts'; -import cn from 'classnames'; - -import s from './Dropdown.module.scss'; type CTX = { isOpen: boolean; close: () => void }; const DropdownContext = createContext<CTX>({} as CTX); @@ -43,15 +40,19 @@ export const DropdownItem: FC<DropdownItemProps> = ({ <li className='list-none list-item'> <button {...props} - className={cn( - props.className, - s.item, - 'group w-full space-x-2 hover:text-primary text-white' - )} + className={` + flex items-center self-stretch w-full + py-2 pl-4 pr-8 + text-sm font-medium tracking-[0.00875rem] + text-white hover:text-primary + hover:bg-charcoal-3 hover:cursor-pointer + group space-x-2 + ${props.className || ''} + `} onClick={onClick} > {Icon && <Icon className='w-9 h-9 text-charcoal-1 group-hover:text-primary' />} - <span className=''>{children}</span> + <span>{children}</span> </button> </li> ); @@ -67,7 +68,6 @@ const Dropdown: FC<Props> = ({ children, className, isOpen, onChange }) => { const dropdownRef = useRef<HTMLDivElement>(null); const close = useCallback(() => onChange(false), [onChange]); useOnClickOutside(dropdownRef, (e) => { - // Check if the click came from the trigger button const target = e.target as HTMLElement; const isTriggerButton = target.closest('[data-dropdown-trigger]'); if (!isTriggerButton) { @@ -79,9 +79,15 @@ const Dropdown: FC<Props> = ({ children, className, isOpen, onChange }) => { <DropdownContext.Provider value={{ isOpen, close }}> <div ref={dropdownRef} - className={cn(className, 'bg-charcoal-4-80 backdrop-blur-md min-w-[16rem] z-10', s.root, { - hidden: !isOpen - })} + className={` + absolute right-0 top-full + min-w-[16rem] z-10 + rounded-xl shadow-lg + py-4 + bg-charcoal-4-80 backdrop-blur-md + ${!isOpen ? 'hidden' : ''} + ${className || ''} + `} > {children} </div> diff --git a/src/components/common/EmojiPortal.tsx b/src/components/common/EmojiPortal.tsx index 472b75034f8292d35dd167d84c643046115e394d..0f49cc5ad49470e75f7b98f667baa03ee16f8e3d 100644 --- a/src/components/common/EmojiPortal.tsx +++ b/src/components/common/EmojiPortal.tsx @@ -12,7 +12,7 @@ import { createPortal } from 'react-dom'; import Picker from '@emoji-mart/react'; import data from '@emoji-mart/data'; import { useOnClickOutside } from 'usehooks-ts'; -import { WithChildren } from '@types'; +import { WithChildren } from 'src/types'; import { AppEvents, appBus } from 'src/events'; import EmojisPickerIcon from 'src/components/icons/EmojisPicker'; @@ -30,6 +30,22 @@ export const EmojiPortal: FC<WithChildren> = ({ children }) => { useOnClickOutside(pickerRef, () => setPickerVisible(false)); + // Create portal element if it doesn't exist + useEffect(() => { + let portalElement = document.getElementById('emoji-portal'); + if (!portalElement) { + portalElement = document.createElement('div'); + portalElement.id = 'emoji-portal'; + document.body.appendChild(portalElement); + } + return () => { + // Clean up only if we created it + if (portalElement && !document.getElementById('emoji-portal')) { + portalElement.remove(); + } + }; + }, []); + const openEmojiPicker = useCallback((rect: DOMRect) => { setPickerStyle({ top: Math.min(rect?.bottom + 5, window.innerHeight - 440), diff --git a/src/components/common/ErrorBoundary.tsx b/src/components/common/ErrorBoundary.tsx index 623c75d084bde6070d907db27a01a559198203fd..b6dfe37eda6a17916b2a38d5514dc56fbf1a43ef 100644 --- a/src/components/common/ErrorBoundary.tsx +++ b/src/components/common/ErrorBoundary.tsx @@ -1,60 +1,31 @@ -import type { FC } from 'react'; -import type { WithChildren } from 'src/types'; +import React from 'react'; +import { ErrorBoundary as ReactErrorBoundary } from 'react-error-boundary'; +import { Helmet } from 'react-helmet-async'; -import React, { useCallback } from 'react'; -import { useTranslation } from 'react-i18next'; -import { ErrorBoundary as LibBoundary } from 'react-error-boundary'; - -import { Download } from '@components/icons'; -import Button from './Button'; - -type ErrorProps = { - resetErrorBoundary: () => void; +type Props = { + children: React.ReactNode; }; -const ErrorComponent: FC<ErrorProps> = ({ resetErrorBoundary }) => { - const { t } = useTranslation(); - const exportLogs = useCallback(async () => { - if (!window.getCrashedLogFile) { - console.error('Log file required'); - throw new Error('Log file required'); - } - - const filename = 'xxdk.log'; - const data = await window.getCrashedLogFile(); - const file = new Blob([data], { type: 'text/plain' }); - const a = document.createElement('a'), - url = URL.createObjectURL(file); - a.href = url; - a.download = filename; - document.body.appendChild(a); - a.click(); - setTimeout(function () { - document.body.removeChild(a); - window.URL.revokeObjectURL(url); - }, 0); - }, []); - +const ErrorFallback = ({ error }: { error: Error }) => { return ( - <div className='flex w-full h-screen content-center justify-center flex-col'> - <div className='text-center space-y-2'> - <h2 className='mb-6'>{t('Oops, something went wrong!')}</h2> - <p className='space-x-4'> - <Button onClick={exportLogs}> - {t('Logs for the nerds')} - <Download height='1rem' className='inline ml-1' /> - </Button> - <Button type='button' onClick={resetErrorBoundary}> - {t('Try again?')} - </Button> - </p> - </div> - </div> + <> + <Helmet> + <title>Error - Haven Web</title> + </Helmet> + <section role='alert' className='error-boundary'> + <h2>Something went wrong:</h2> + <pre>{error.message}</pre> + </section> + </> ); }; -const ErrorBoundary: FC<WithChildren> = ({ children }) => { - return <LibBoundary FallbackComponent={ErrorComponent}>{children}</LibBoundary>; +const ErrorBoundary: React.FC<Props> = ({ children }) => { + return ( + <ReactErrorBoundary FallbackComponent={ErrorFallback} onReset={() => window.location.reload()}> + {children} + </ReactErrorBoundary> + ); }; export default ErrorBoundary; diff --git a/src/components/common/FormError.tsx b/src/components/common/FormError.tsx index 6209478a7cbc467a40fe98dd421bbfe14961d1ec..ed964537eb5f1acb074ffe5348bee01454e5e8c2 100644 --- a/src/components/common/FormError.tsx +++ b/src/components/common/FormError.tsx @@ -1,4 +1,4 @@ -import type { WithChildren } from '@types'; +import type { WithChildren } from 'src/types'; import type { FC } from 'react'; import ErrorIcon from 'src/components/icons/Error'; diff --git a/src/components/common/GoogleButton.tsx b/src/components/common/GoogleButton.tsx deleted file mode 100644 index 7f7aa8163f002911cf2ab38702e331c2248ade88..0000000000000000000000000000000000000000 --- a/src/components/common/GoogleButton.tsx +++ /dev/null @@ -1,51 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import React, { FC } from 'react'; -import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -import { faGoogleDrive } from '@fortawesome/free-brands-svg-icons'; -import { useTranslation } from 'react-i18next'; -import { useGoogleLogin } from '@react-oauth/google'; -import cn from 'classnames'; - -import { AppEvents, appBus } from 'src/events'; -import Button, { Props as ButtonProps } from './Button'; - -declare global { - interface Window { - google: any; - } -} - -type Props = Partial<ButtonProps> & { - onStartLoading?: () => void; - password?: string; -}; - -const GoogleButton: FC<Props> = ({ onStartLoading = () => {}, ...props }) => { - const { t } = useTranslation(); - - const login = useGoogleLogin({ - scope: 'https://www.googleapis.com/auth/drive.appdata', - prompt: 'consent', - onSuccess: (token) => { - onStartLoading(); - appBus.emit(AppEvents.GOOGLE_TOKEN, token.access_token); - } - }); - - return ( - <Button - {...props} - className={cn('flex justify-center items-center space-x-1')} - id='google-auth-button' - onClick={() => { - login(); - }} - > - <FontAwesomeIcon className='w-5 h-5' icon={faGoogleDrive} /> - - <span className='whitespace-nowrap'>{t('Google Drive')}</span> - </Button> - ); -}; - -export default GoogleButton; diff --git a/src/components/common/Identity/Identity.module.scss b/src/components/common/Identity/Identity.module.scss deleted file mode 100644 index 83faee20b42e6a1b89700f305e152f7f6463aff4..0000000000000000000000000000000000000000 --- a/src/components/common/Identity/Identity.module.scss +++ /dev/null @@ -1,17 +0,0 @@ -.root { - font-weight: 700; - - svg { - width: 12px; - display: inline; - margin-bottom: 2px; - } -} - -.muted { - text-decoration: line-through; -} - -.clickable { - cursor: pointer; -} diff --git a/src/components/common/Identity/index.tsx b/src/components/common/Identity/index.tsx index 3bad24e050c8da29ec6deae54fbb40d5be44c421..b82c44de3187125256c508a3dc257c7238751976 100644 --- a/src/components/common/Identity/index.tsx +++ b/src/components/common/Identity/index.tsx @@ -1,11 +1,7 @@ import { FC, useCallback } from 'react'; - import React, { useMemo } from 'react'; -import cn from 'classnames'; import { useTranslation } from 'react-i18next'; - import { Elixxir } from 'src/components/icons'; -import classes from './Identity.module.scss'; import { useAppDispatch, useAppSelector } from 'src/store/hooks'; import * as app from 'src/store/app'; import { useUtils } from '@contexts/utils-context'; @@ -61,7 +57,12 @@ const Identity: FC<Props> = ({ <span onClick={onClick} title={`${nickname ? `${nickname} – ` : ''}${codename}`} - className={cn(className, classes.root, { [classes.clickable]: clickable })} + className={` + font-bold + ${clickable ? 'cursor-pointer' : ''} + ${isMuted ? 'line-through' : ''} + ${className || ''} + `} > {nickname && ( <> @@ -71,8 +72,8 @@ const Identity: FC<Props> = ({ </> )} - <span style={{ whiteSpace: 'nowrap' }}> - <Elixxir style={{ fill: codenameColor }} /> + <span className='whitespace-nowrap'> + <Elixxir className='w-3 inline mb-0.5' style={{ fill: codenameColor }} /> <span className='codename' style={{ color: codenameColor }}> {codename} </span> @@ -80,13 +81,13 @@ const Identity: FC<Props> = ({ {isMuted && ( <> - <span style={{ color: 'var(--red)' }}>[{t('muted')}]</span> + <span className='text-red'>[{t('muted')}]</span> </> )} {isBlocked && ( <> - <span style={{ color: 'var(--red)' }}>[{t('blocked')}]</span> + <span className='text-red'>[{t('blocked')}]</span> </> )} </span> diff --git a/src/components/common/Input/index.tsx b/src/components/common/Input/index.tsx index 498e372ab0d2af13f447788f9da710111c8f1b1e..96558ece4ada580848eae9ac9119b22daccffa1d 100644 --- a/src/components/common/Input/index.tsx +++ b/src/components/common/Input/index.tsx @@ -1,7 +1,4 @@ import { FC, InputHTMLAttributes } from 'react'; -import cn from 'classnames'; - -import s from './styles.module.scss'; type Size = 'sm' | 'md' | 'lg'; @@ -18,7 +15,17 @@ const sizeMap: Record<Size, string> = { const Input: FC<Props> = ({ size = 'md', ...props }) => ( <input {...props} - className={cn(sizeMap[size], s.root, props.className, 'focus:border-primary')} + className={` + w-full block + rounded-[1.5rem] + px-4 + bg-transparent + border border-[var(--charcoal-1)] + focus:outline-none focus:border-[var(--primary)] + placeholder:text-sm placeholder:text-[var(--charcoal-1)] + ${sizeMap[size]} + ${props.className || ''} + `} /> ); diff --git a/src/components/common/Input/styles.module.scss b/src/components/common/Input/styles.module.scss deleted file mode 100644 index 8bc9d9d07b2db575d6d15313b02418964dff1766..0000000000000000000000000000000000000000 --- a/src/components/common/Input/styles.module.scss +++ /dev/null @@ -1,19 +0,0 @@ -.root { - border-radius: 5px; - width: 100%; - display: block; - padding: 0rem 0.5rem 0rem 1rem; - align-items: center; - border-radius: 1.5rem; - background: none; - border: 1px solid var(--charcoal-1); - - &::placeholder { - font-size: 0.875rem; - color: var(--charcoal-1); - } - - &:focus-visible { - outline: none; - } -} diff --git a/src/components/common/LeftHeader/LeftHeader.module.scss b/src/components/common/LeftHeader/LeftHeader.module.scss deleted file mode 100644 index defc32ce745b9b6e1164155dadbb9af1af6e91e9..0000000000000000000000000000000000000000 --- a/src/components/common/LeftHeader/LeftHeader.module.scss +++ /dev/null @@ -1,9 +0,0 @@ -.root { - display: flex; - width: 100%; - border-top-left-radius: var(--border-radius); - background-color: var(--charcoal-4); - padding: 1rem 0.75rem; - border-right: 1px solid var(--our-black); - justify-content: space-between; -} diff --git a/src/components/common/LeftHeader/SidebarControls.tsx b/src/components/common/LeftHeader/SidebarControls.tsx index 7d0fde5f21392ecb1828487a2165c26d56bf0111..b7c3f9e57fc83258a5997807d3b98efcef0d1cdb 100644 --- a/src/components/common/LeftHeader/SidebarControls.tsx +++ b/src/components/common/LeftHeader/SidebarControls.tsx @@ -13,25 +13,24 @@ const SidebarControls: FC = () => { const dmsDisabled = allChannels.length === 0; return ( - <div className='space-x-1 flex items-center'> + <div className='flex items-center space-x-1'> <button title={t('Spaces')} onClick={() => setSidebarView('spaces')}> <Spaces - style={{ - fill: leftSidebarView === 'spaces' ? 'var(--primary)' : 'var(--charcoal-1)' - }} + className={ + leftSidebarView === 'spaces' ? 'fill-[var(--primary)]' : 'fill-[var(--charcoal-1)]' + } /> </button> <button - className='disabled:cursor-not-allowed' + className='disabled:cursor-not-allowed disabled:opacity-25' title={dmsDisabled ? t('Join or create a channel first.') : t('Direct Messages')} disabled={dmsDisabled} - style={{ opacity: dmsDisabled ? 0.25 : 1 }} onClick={() => setSidebarView('dms')} > <Dms - style={{ - fill: leftSidebarView === 'dms' ? 'var(--primary)' : 'var(--charcoal-1)' - }} + className={ + leftSidebarView === 'dms' ? 'fill-[var(--primary)]' : 'fill-[var(--charcoal-1)]' + } /> </button> </div> diff --git a/src/components/common/LeftHeader/User.tsx b/src/components/common/LeftHeader/User.tsx index 54428e3159cbd72c6e0fff9766cc2372f2b0155b..8e11c91d7099cdd1d9678bdb8509f23be72dabec 100644 --- a/src/components/common/LeftHeader/User.tsx +++ b/src/components/common/LeftHeader/User.tsx @@ -12,27 +12,19 @@ const User: FC = () => { return codename ? ( <button - className='flex items-center text-blue font-semibold text-xs flex-nowrap text-md overflow-hidden' + className='flex items-center text-blue font-semibold text-xs flex-nowrap overflow-hidden' onClick={() => setSidebarView('settings')} > <Profile - style={{ - fill: sidebarView === 'settings' ? 'var(--primary)' : 'var(--charcoal-1)' - }} + className={ + sidebarView === 'settings' ? 'fill-[var(--primary)]' : 'fill-[var(--charcoal-1)]' + } /> <span - className='flex-grow whitespace-nowrap text-md' + className='flex-1 whitespace-nowrap text-[0.8125rem] max-w-[12rem] truncate' title={codename} - style={{ - fontSize: '0.8125rem', - maxWidth: '12rem', - flexGrow: 1, - whiteSpace: 'nowrap', - textOverflow: 'ellipsis', - overflow: 'hidden' - }} > - <Elixxir style={{ fill: 'var(--blue)', width: '1ch', display: 'inline' }} /> + <Elixxir className='fill-[var(--blue)] w-[1ch] inline' /> {codename} </span> </button> diff --git a/src/components/common/LeftHeader/index.tsx b/src/components/common/LeftHeader/index.tsx index 2baf4e0cc9ff4d52e214185b9b4fccab8454a751..e77a3fcabff9f08248c9d1c26eca40b71999ca40 100644 --- a/src/components/common/LeftHeader/index.tsx +++ b/src/components/common/LeftHeader/index.tsx @@ -1,7 +1,5 @@ import React, { FC } from 'react'; -import cn from 'classnames'; -import s from './LeftHeader.module.scss'; import User from './User'; import SidebarControls from './SidebarControls'; @@ -11,7 +9,16 @@ type Props = { const Header: FC<Props> = ({ className }) => { return ( - <div className={cn(className, s.root)}> + <div + className={` + flex w-full justify-between + bg-[var(--charcoal-4)] + px-3 py-4 + border-r border-r-[var(--our-black)] + rounded-tl-[var(--border-radius)] + ${className || ''} + `} + > <User /> <SidebarControls /> </div> diff --git a/src/components/common/LeftSideBar/LeftSideBar.tsx b/src/components/common/LeftSideBar/LeftSideBar.tsx index 38cdbfdefdec15ef69fb8f452971b421d8f0807f..cc9a3ab809314d6223d94236ad89c7e084e7515b 100644 --- a/src/components/common/LeftSideBar/LeftSideBar.tsx +++ b/src/components/common/LeftSideBar/LeftSideBar.tsx @@ -1,12 +1,12 @@ import type { FC } from 'react'; import cn from 'classnames'; -import { WithChildren } from '@types'; +import { WithChildren } from 'src/types'; import { LeftSidebarView } from 'src/types/ui'; import DMs from '../DMs'; import Spaces from '../Spaces'; import SettingsMenu from '../SettingsMenu'; -import { useUI } from '@contexts/ui-context'; +import { useUI } from 'src/contexts/ui-context'; const views: Record<LeftSidebarView, FC> = { dms: DMs, diff --git a/src/components/common/Loading/Loading.module.scss b/src/components/common/Loading/Loading.module.scss deleted file mode 100644 index 31e6ab58f779d2c58887a5ebb9d4017f5a83fac7..0000000000000000000000000000000000000000 --- a/src/components/common/Loading/Loading.module.scss +++ /dev/null @@ -1,19 +0,0 @@ -.root { - width: 100vw; - height: 100vh; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - - & > div { - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; - } - - svg { - fill: var(--cyan) !important; - } -} diff --git a/src/components/common/Loading/Loading.tsx b/src/components/common/Loading/Loading.tsx index 76d033b8d3e82856f113cd7b01082d3ad44b4bcf..3c0148d3db4a69a2ba5a7c29f470442e5f86c194 100644 --- a/src/components/common/Loading/Loading.tsx +++ b/src/components/common/Loading/Loading.tsx @@ -1,9 +1,6 @@ -import type { WithChildren } from '@types'; +import type { WithChildren } from 'src/types'; import type { FC } from 'react'; -import cn from 'classnames'; import { useTranslation } from 'react-i18next'; - -import s from './Loading.module.scss'; import { Spinner } from 'src/components/common'; type Props = WithChildren; @@ -11,8 +8,8 @@ type Props = WithChildren; const Loading: FC<Props> = ({ children }) => { const { t } = useTranslation(); return ( - <div className={cn(s.root)}> - <div> + <div className='w-screen h-screen flex flex-col items-center justify-center [&_svg]:fill-[var(--cyan)]'> + <div className='flex flex-col items-center justify-center'> {children ? children : <Spinner size='lg' />} <div className='mt-2'>{t('Loading...')}</div> </div> diff --git a/src/components/common/MainHeader/index.tsx b/src/components/common/MainHeader/index.tsx index fc9278f15cea5b0860c1d8cc05bbeff62827c30d..96b4ecff444af02a6b0f1e2e2474a0d17e402c50 100644 --- a/src/components/common/MainHeader/index.tsx +++ b/src/components/common/MainHeader/index.tsx @@ -1,14 +1,10 @@ -import React, { FC } from 'react'; -import cn from 'classnames'; - +import { FC } from 'react'; import { useAppSelector } from 'src/store/hooks'; -import ChannelHeader from '../ChannelHeader'; import * as channels from 'src/store/channels'; import * as dms from 'src/store/dms'; -import Identity from '../Identity'; - -import s from './styles.module.scss'; import { useUI } from '@contexts/ui-context'; +import ChannelHeader from '../ChannelHeader'; +import Identity from '../Identity'; type Props = { className?: string; @@ -20,7 +16,13 @@ const MainHeader: FC<Props> = ({ className }) => { const { leftSidebarView: sidebarView } = useUI(); return ( - <div className={cn(className, s.root)}> + <div + className={` + rounded-tr-[var(--border-radius)] + bg-[var(--charcoal-4)] + ${className || ''} + `} + > {currentChannel && sidebarView === 'spaces' && <ChannelHeader {...currentChannel} />} {currentConversation && sidebarView === 'dms' && ( <ChannelHeader diff --git a/src/components/common/MainHeader/styles.module.scss b/src/components/common/MainHeader/styles.module.scss deleted file mode 100644 index 7cc390696fce6fb6a16424591317a857db10a670..0000000000000000000000000000000000000000 --- a/src/components/common/MainHeader/styles.module.scss +++ /dev/null @@ -1,4 +0,0 @@ -.root { - border-top-right-radius: var(--border-radius); - background-color: var(--charcoal-4); -} diff --git a/src/components/common/Notices/index.tsx b/src/components/common/Notices/index.tsx index 8d7114d98bcad1221faeaf059ceb16e4df2d7df3..e6c02e24f5d4cf2cfc06e9395ba9ecea3dfdfd2f 100644 --- a/src/components/common/Notices/index.tsx +++ b/src/components/common/Notices/index.tsx @@ -5,8 +5,8 @@ import { useAppSelector } from 'src/store/hooks'; import * as channels from 'src/store/channels'; import * as messages from 'src/store/messages'; import * as dms from 'src/store/dms'; -import { EasterEggs, useUI } from '@contexts/ui-context'; -import { WithChildren } from '@types'; +import { EasterEggs, useUI } from 'src/contexts/ui-context'; +import { WithChildren } from 'src/types'; import Identity from '../Identity'; import NoticeIcon from 'src/components/icons/Notice'; diff --git a/src/components/common/NotificationBanner/index.tsx b/src/components/common/NotificationBanner/index.tsx index 265391fdf7304c921b24f3fcc198f5a863fccedd..05e35d14d93e387c6656346218d528516db7bf99 100644 --- a/src/components/common/NotificationBanner/index.tsx +++ b/src/components/common/NotificationBanner/index.tsx @@ -1,10 +1,6 @@ -import cn from 'classnames'; - +import { useTranslation } from 'react-i18next'; import useNotification from 'src/hooks/useNotification'; import Close from 'src/components/icons/X'; -import { useTranslation } from 'react-i18next'; - -import s from './styles.module.scss'; const NotificationBanner = () => { const { t } = useTranslation(); @@ -13,11 +9,24 @@ const NotificationBanner = () => { const showBanner = !isPermissionGranted && !permissionIgnored; return showBanner ? ( - <div className={cn(s.root, 'drop-shadow-xl absolute bg-near-black flex justify-between z-10')}> - <span> + <div + className=' + absolute top-0 left-0 w-full + px-[60px] py-2 + bg-near-black + flex justify-between + drop-shadow-xl + z-10 + ' + > + <span className='block w-full max-w-[1440px] mx-auto'> {t('Haven uses desktop notifications.')} - <button aria-label={t('Enable desktop notifications')} onClick={request}> + <button + className='text-[var(--primary)]' + aria-label={t('Enable desktop notifications')} + onClick={request} + > {t('Enable?')} </button> </span> @@ -25,7 +34,7 @@ const NotificationBanner = () => { data-testid='close-notification-banner-button' onClick={() => setPermissionIgnored(true)} aria-label={t('Close panel')} - className={cn('w-6 h-6', s.close)} + className='w-6 h-6 cursor-pointer [&_path]:fill-[var(--primary)] [&_path]:stroke-2' /> </div> ) : null; diff --git a/src/components/common/NotificationBanner/styles.module.scss b/src/components/common/NotificationBanner/styles.module.scss deleted file mode 100644 index c438170a4d60dacebacce6d3a26a528dd79916f6..0000000000000000000000000000000000000000 --- a/src/components/common/NotificationBanner/styles.module.scss +++ /dev/null @@ -1,30 +0,0 @@ -.root { - padding: 0.5rem 60px; - - span { - display: block; - max-width: 1440px; - margin: 0 auto; - width: 100%; - } - - top: 0; - left: 0; - width: 100%; - - button { - color: var(--primary); - } - - display: flex; - justify-content: space-between; - - svg { - cursor: pointer; - } - - svg path { - fill: var(--primary); - stroke-width: 2px; - } -} diff --git a/src/components/common/NotificationSound.tsx b/src/components/common/NotificationSound.tsx new file mode 100644 index 0000000000000000000000000000000000000000..3dcb29b7e64248b64b028d87a2929f6f9330c697 --- /dev/null +++ b/src/components/common/NotificationSound.tsx @@ -0,0 +1,71 @@ +import { FC, useEffect, useState, lazy, Suspense } from 'react'; + +type Props = { + soundUrl: string; + onInit: (play: () => void) => void; +}; + +// Lazy load the sound component +const SoundPlayer = lazy(async () => { + try { + // First import use-sound module + const useSound = (await import('use-sound')).default; + + return { + default: function Sound({ soundUrl, onInit }: Props) { + const [play] = useSound(soundUrl, { + html5: true, + preload: true, + volume: 1.0 + }); + + useEffect(() => { + if (play) { + onInit(play); + } + }, [play, onInit]); + + return null; + } + }; + } catch (err) { + console.error('Error loading sound player:', err); + // Return a fallback component that won't break + return { + default: () => null + }; + } +}); + +const NotificationSound: FC<Props> = (props) => { + const [shouldLoad, setShouldLoad] = useState(false); + + useEffect(() => { + const handleInteraction = () => { + setShouldLoad(true); + window.removeEventListener('click', handleInteraction, true); + window.removeEventListener('touchstart', handleInteraction, true); + window.removeEventListener('keydown', handleInteraction, true); + }; + + window.addEventListener('click', handleInteraction, true); + window.addEventListener('touchstart', handleInteraction, true); + window.addEventListener('keydown', handleInteraction, true); + + return () => { + window.removeEventListener('click', handleInteraction, true); + window.removeEventListener('touchstart', handleInteraction, true); + window.removeEventListener('keydown', handleInteraction, true); + }; + }, []); + + if (!shouldLoad) return null; + + return ( + <Suspense fallback={null}> + <SoundPlayer {...props} /> + </Suspense> + ); +}; + +export default NotificationSound; diff --git a/src/components/common/NotificationSoundSelector/index.tsx b/src/components/common/NotificationSoundSelector/index.tsx index 1b794370e239e19fe9c5548ef98dc25c1e9a650b..52f14d8db0deb77d5f5faedb54a393a55c5a4d01 100644 --- a/src/components/common/NotificationSoundSelector/index.tsx +++ b/src/components/common/NotificationSoundSelector/index.tsx @@ -1,5 +1,4 @@ -import { useEffect, useMemo, useState } from 'react'; -import useSound from 'use-sound'; +import { useEffect, useMemo, useState, FC } from 'react'; import Select from 'react-tailwindcss-select'; import { useRemotelySynchedString } from 'src/hooks/useRemotelySynchedValue'; @@ -11,48 +10,99 @@ const options = [ { label: 'ICQ', value: '/sounds/classic-icq.wav' } ]; -const SoundSelector = () => { +const NotificationSoundSelector: FC = () => { const [touched, setTouched] = useState(false); + const [play, setPlay] = useState<(() => void) | null>(null); + const [stop, setStop] = useState<(() => void) | null>(null); const { set: setNotificationSound, value: notificationSound } = useRemotelySynchedString( 'notification-sound', '/sounds/notification.mp3' ); - const [play, { stop }] = useSound(notificationSound ?? ''); - const selectedOption = useMemo( - () => options.find((o) => o.value === notificationSound) ?? null, - [notificationSound] - ); useEffect(() => { - if (touched) { + let mounted = true; + + const initSound = async () => { + try { + const [{ default: useSound }] = await Promise.all([import('use-sound')]); + + // Create and resume audio context + const AudioContext = window.AudioContext || (window as any).webkitAudioContext; + const tempContext = new AudioContext(); + await tempContext.resume(); + + if (!mounted) return; + + const [playFn, { stop: stopFn }] = useSound(notificationSound ?? ''); + if (mounted) { + setPlay(() => playFn); + setStop(() => stopFn); + } + + // Clean up temp context + await tempContext.close(); + } catch (error) { + console.error('Failed to initialize audio:', error); + } + }; + + const handleInteraction = () => { + initSound().catch(console.error); + window.removeEventListener('click', handleInteraction, true); + window.removeEventListener('touchstart', handleInteraction, true); + window.removeEventListener('keydown', handleInteraction, true); + }; + + window.addEventListener('click', handleInteraction, true); + window.addEventListener('touchstart', handleInteraction, true); + window.addEventListener('keydown', handleInteraction, true); + + return () => { + mounted = false; + window.removeEventListener('click', handleInteraction, true); + window.removeEventListener('touchstart', handleInteraction, true); + window.removeEventListener('keydown', handleInteraction, true); + }; + }, [notificationSound]); + + useEffect(() => { + if (touched && play) { play(); } - - return () => stop(); + return () => { + if (stop) stop(); + }; }, [play, stop, touched]); + const selectedOption = useMemo( + () => options.find((o) => o.value === notificationSound) ?? null, + [notificationSound] + ); + return ( - <Select - classNames={{ - menu: 'bg-charcoal-4 py-4 rounded-xl mt-1 absolute w-full', - menuButton: () => - 'text-md rounded-3xl px-4 font-semibold flex bg-primary text-near-black justify-center', - listItem: ({ isSelected } = { isSelected: false }) => - `block transition font-semibold duration-200 hover:bg-primary hover:text-near-black p-2 cursor-pointer select-none truncate ${ - isSelected ? ' bg-charcoal-3' : 'text-charcoal-1' - }` - }} - primaryColor={'primary'} - options={options} - value={selectedOption} - onChange={(o) => { - if (o && !Array.isArray(o) && o !== null) { - setTouched(true); - setNotificationSound(o.value); - } - }} - /> + <div className='p-16 h-[32rem]'> + <Select + classNames={{ + menu: 'bg-charcoal-4 py-4 rounded-xl mt-1 absolute w-full', + menuButton: () => + 'text-md rounded-3xl px-4 font-semibold flex bg-primary text-near-black justify-center', + listItem: ({ isSelected } = { isSelected: false }) => + `block transition font-semibold duration-200 hover:bg-primary hover:text-near-black p-2 cursor-pointer select-none truncate ${ + isSelected ? ' bg-charcoal-3' : 'text-charcoal-1' + }` + }} + primaryColor={'primary'} + options={options} + value={selectedOption} + onChange={(o) => { + if (o && !Array.isArray(o) && o !== null) { + setTouched(true); + setNotificationSound(o.value); + } + }} + /> + </div> ); }; -export default SoundSelector; +export default NotificationSoundSelector; diff --git a/src/components/common/NotificationSoundSelector/styles.module.scss b/src/components/common/NotificationSoundSelector/styles.module.scss deleted file mode 100644 index 10aec8d4b7f2b4acbef66224c9e9d1652a1d89bf..0000000000000000000000000000000000000000 --- a/src/components/common/NotificationSoundSelector/styles.module.scss +++ /dev/null @@ -1,4 +0,0 @@ -.root { - padding: 4rem; - height: 32rem; -} diff --git a/src/components/common/ProgressBar/ProgressBar.module.scss b/src/components/common/ProgressBar/ProgressBar.module.scss deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/src/components/common/ProgressBar/ProgressBar.tsx b/src/components/common/ProgressBar/ProgressBar.tsx index 041be2c90cfc6e61633661b91fa8bb6cae23d1cf..ec2c3d6b1d11e34e3d2ccdeae8dd407d0dd5a8c6 100644 --- a/src/components/common/ProgressBar/ProgressBar.tsx +++ b/src/components/common/ProgressBar/ProgressBar.tsx @@ -1,41 +1,17 @@ const ProgressBar = (props: { completed: number }) => { const { completed } = props; - - const containerStyles = { - height: 40, - width: '320px', - borderRadius: 50, - margin: 50, - border: '2px solid var(--secondary)' - }; - - const fillerStyles = { - height: '100%', - width: `${completed > 100 ? 100 : completed}%`, - backgroundColor: 'var(--secondary)', - borderRadius: 'inherit' - }; - - const labelStyles = { - padding: 5, - color: 'white', - fontWeight: 'bold' - }; + const normalizedCompleted = completed > 100 ? 100 : completed; return ( - <div className='relative' style={containerStyles}> - <div className='text-center' style={fillerStyles}> - <span style={labelStyles} /> - <span - style={{ - position: 'absolute', - left: '50%', - transform: 'translate(-50%, -50%)', - top: '50%', - fontWeight: '700', - fontSize: '14px' - }} - >{`${completed > 100 ? 100 : completed}%`}</span> + <div className='relative h-10 w-[320px] rounded-[50px] my-[50px] mx-auto border-2 border-[var(--secondary)]'> + <div + className='h-full rounded-[inherit] bg-[var(--secondary)] text-center' + style={{ width: `${normalizedCompleted}%` }} + > + <span className='p-[5px] text-white font-bold' /> + <span className='absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 font-bold text-sm'> + {`${normalizedCompleted}%`} + </span> </div> </div> ); diff --git a/src/components/common/RightSideBar/ChannelNotifications.tsx b/src/components/common/RightSideBar/ChannelNotifications.tsx index 09fcd8b22aa0e65a6502f48cf13c4089e9c46790..7747770a7199fb0671811d296bfa828748ee18aa 100644 --- a/src/components/common/RightSideBar/ChannelNotifications.tsx +++ b/src/components/common/RightSideBar/ChannelNotifications.tsx @@ -7,10 +7,10 @@ import { useTranslation } from 'react-i18next'; import { fullIdentity } from 'src/store/selectors'; import * as channels from 'src/store/channels'; import RightSideTitle from './RightSideTitle'; -import { ChannelNotificationLevel, NotificationStatus } from '@types'; -import { useUtils } from '@contexts/utils-context'; -import { useNetworkClient } from '@contexts/network-client-context'; -import { notificationLevelDecoder, notificationStatusDecoder } from '@utils/decoders'; +import { ChannelNotificationLevel, NotificationStatus } from 'src/types'; +import { useUtils } from 'src/contexts/utils-context'; +import { useNetworkClient } from 'src/contexts/network-client-context'; +import { notificationLevelDecoder, notificationStatusDecoder } from 'src/utils/decoders'; const ChannelNotifications = () => { const { utils } = useUtils(); @@ -88,7 +88,7 @@ const ChannelNotifications = () => { (evt) => { const level = notificationLevelDecoder.decode(parseInt(evt.target.value, 10)); if (level.isOk()) { - changeNotificationLevel(level.value); + changeNotificationLevel(level.value as unknown as ChannelNotificationLevel); } else { throw new Error(`Unknown notification level ${level.error}`); } @@ -117,7 +117,7 @@ const ChannelNotifications = () => { (evt) => { const status = notificationStatusDecoder.decode(parseInt(evt.target.value, 10)); if (status.isOk()) { - changeNotificationStatus(status.value); + changeNotificationStatus(status.value as unknown as NotificationStatus); } else { throw new Error(`Unknown notification status: ${status.error}`); } @@ -140,7 +140,7 @@ const ChannelNotifications = () => { id='notification-levels' > <option value={NotificationStatus.WhenOpen}>When Open</option> - <option value={NotificationStatus.Push}>Push</option> + <option value={NotificationStatus.All}>All</option> <option value={NotificationStatus.Mute}>Mute</option> </select> </div> diff --git a/src/components/common/RightSideBar/Contributors.tsx b/src/components/common/RightSideBar/Contributors.tsx index 986d9c2ce0f8fddb3bc6b1bca9c77095497bb42f..13f0363d0a8913e94e6e81773cf39fef51ceb6bb 100644 --- a/src/components/common/RightSideBar/Contributors.tsx +++ b/src/components/common/RightSideBar/Contributors.tsx @@ -31,7 +31,9 @@ const ContributorComponent: FC<Contributor> = (contributor) => { ); const onClick = useCallback(() => { - assert(typeof contributor.dmToken === 'number', 'Token required for dm'); + if (typeof contributor.dmToken !== 'number') { + throw new Error('Token required for dm'); + } createConversation({ ...contributor, color: contributor.color ?? 'var(--text-charcoal-1)', diff --git a/src/components/common/RightSideBar/RightSideTitle.tsx b/src/components/common/RightSideBar/RightSideTitle.tsx index 1e1f43802b1503d7797971ab79a092044fe56bbf..52a69a41eaf7b7ba7593d1eaeea34e2cb6fa7447 100644 --- a/src/components/common/RightSideBar/RightSideTitle.tsx +++ b/src/components/common/RightSideBar/RightSideTitle.tsx @@ -1,4 +1,4 @@ -import type { WithChildren } from '@types'; +import type { WithChildren } from 'src/types'; import type { FC } from 'react'; const RightSideTitle: FC<WithChildren> = ({ children }) => ( diff --git a/src/components/common/RightSideBar/SpaceDetails.tsx b/src/components/common/RightSideBar/SpaceDetails.tsx index d85b07aba410d5fca629692333c60d00735a00de..a1861e37bd81167424d17616f3ed2e9846e7d4be 100644 --- a/src/components/common/RightSideBar/SpaceDetails.tsx +++ b/src/components/common/RightSideBar/SpaceDetails.tsx @@ -27,7 +27,7 @@ const SpaceDetails = () => { } const fn = dmsEnabled ? 'DisableDirectMessages' : 'EnableDirectMessages'; - channelManager?.[fn](Buffer.from(currentChannel.id, 'base64')); + channelManager?.[fn](new Uint8Array(Buffer.from(currentChannel.id, 'base64'))); }, [channelManager, currentChannel, dmsEnabled]); return currentChannel && identity ? ( diff --git a/src/components/common/SearchInput.module.scss b/src/components/common/SearchInput.module.scss deleted file mode 100644 index e32f50decd6a790124f4f55d3e74a0c0acb96960..0000000000000000000000000000000000000000 --- a/src/components/common/SearchInput.module.scss +++ /dev/null @@ -1,4 +0,0 @@ -.search { - position: relative; - margin-bottom: 0.5rem; -} diff --git a/src/components/common/SearchInput.tsx b/src/components/common/SearchInput.tsx index b0f2b5ab5fea9467b161901579bbedfd393a726e..3f7834706d4294694a2850c880957d40e0195c1c 100644 --- a/src/components/common/SearchInput.tsx +++ b/src/components/common/SearchInput.tsx @@ -1,15 +1,11 @@ import { FC } from 'react'; import { useTranslation } from 'react-i18next'; -import cn from 'classnames'; - import Input, { Props } from 'src/components/common/Input'; -import s from './SearchInput.module.scss'; - const SearchInput: FC<Props> = ({ className, ...props }) => { const { t } = useTranslation(); return ( - <div className={cn(className, s.search)}> + <div className={`relative mb-2 ${className || ''}`}> <Input {...props} placeholder={props.placeholder || t('Search...')} /> <div className='absolute inset-y-0 right-2 flex items-center pl-3 pointer-events-none'> <svg diff --git a/src/components/common/Spaces/Space.module.scss b/src/components/common/Spaces/Space.module.scss deleted file mode 100644 index 7a24483a86f695fbafe112f6e3f83c58aa55ae44..0000000000000000000000000000000000000000 --- a/src/components/common/Spaces/Space.module.scss +++ /dev/null @@ -1,50 +0,0 @@ -.root { - padding: 0.75rem 0.875rem 0.8125rem 0.875rem; - - .name { - font-size: 0.875rem; - font-style: normal; - font-weight: 700; - line-height: 1.25rem; - overflow: hidden; - text-overflow: ellipsis; - } - - .message-preview { - color: var(--charcoal-1); - font-size: 0.8125rem; - font-style: normal; - font-weight: 400; - line-height: 1.1875rem; - overflow: hidden; - text-overflow: ellipsis; - } - - .badge { - font-size: 0.6875rem; - font-style: normal; - font-weight: 400; - line-height: normal; - letter-spacing: 0.0275rem; - padding: 0.25rem 0.375rem 0.1875rem 0.375rem; - border-radius: 1rem; - background: var(--charcoal-2); - } - - .date { - color: var(--charcoal-2); - font-size: 0.6875rem; - font-style: normal; - font-weight: 400; - line-height: normal; - letter-spacing: 0.0275rem; - } - - &:hover, - &.active { - border: none; - border-radius: var(--border-radius); - background-color: var(--charcoal-4); - cursor: pointer; - } -} diff --git a/src/components/common/Spaces/Space.tsx b/src/components/common/Spaces/Space.tsx index 55d8d2075aabc94c319dfc637c89859ebfbc8870..731ae8937ec4cb7f8c0b883924581af23d9b16da 100644 --- a/src/components/common/Spaces/Space.tsx +++ b/src/components/common/Spaces/Space.tsx @@ -4,7 +4,6 @@ import dayjs from 'dayjs'; import cn from 'classnames'; import { useTranslation } from 'react-i18next'; -import s from './Space.module.scss'; import React from 'react'; import { Star } from 'lucide-react'; @@ -29,9 +28,18 @@ const Space: FC<Props> = ({ const { t } = useTranslation(); return ( - <div {...props} className={cn(props.className, s.root, { [s.active]: active })}> + <div + {...props} + className={cn( + props.className, + 'px-3.5 py-3 hover:bg-charcoal-4 hover:cursor-pointer hover:rounded-[var(--border-radius)]', + { + 'bg-charcoal-4 rounded-[var(--border-radius)]': active + } + )} + > <div className='flex justify-between w-full items-center space-x-2'> - <h5 className={cn(s.name, 'flex items-center space-x-1')}> + <h5 className='text-sm font-bold leading-5 overflow-hidden text-ellipsis flex items-center space-x-1'> {name} {favorite && ( <Star width='12' height='20' className='text-primary ml-1' fill='currentColor' /> @@ -39,7 +47,9 @@ const Space: FC<Props> = ({ </h5> <div className='flex space-x-1'> {date ? ( - <span className={s.date}>{dayjs(date).format('YYYY/MM/DD')}</span> + <span className='text-[0.6875rem] font-normal text-charcoal-2 tracking-[0.0275rem]'> + {dayjs(date).format('YYYY/MM/DD')} + </span> ) : ( <span className='text-primary text-xs'>{t('New!')}</span> )} @@ -47,9 +57,13 @@ const Space: FC<Props> = ({ </div> {message && ( <div className='flex justify-between w-full'> - <p className={cn('whitespace-nowrap', s['message-preview'])}>{message}</p> + <p className='whitespace-nowrap overflow-hidden text-ellipsis text-[0.8125rem] leading-[1.1875rem] text-charcoal-1'> + {message} + </p> {missedMessagesCount > 0 && ( - <span className={cn(s.badge, 'ml-1')}>{missedMessagesCount}</span> + <span className='ml-1 text-[0.6875rem] tracking-[0.0275rem] py-1 px-1.5 rounded-2xl bg-charcoal-2'> + {missedMessagesCount} + </span> )} </div> )} diff --git a/src/components/common/Spaces/index.tsx b/src/components/common/Spaces/index.tsx index a35797ca12d00096b2e3b6dfd3360dd27d284393..df8317f4def20248febc3d22f7f310f020b568f9 100644 --- a/src/components/common/Spaces/index.tsx +++ b/src/components/common/Spaces/index.tsx @@ -7,7 +7,6 @@ import * as channels from 'src/store/channels'; import * as app from 'src/store/app'; import SearchInput from '../SearchInput'; import useChannelFavorites from 'src/hooks/useChannelFavorites'; -import s from './styles.module.scss'; import Space from './Space'; import * as messages from 'src/store/messages'; import Add from 'src/components/icons/Add'; @@ -76,7 +75,7 @@ const Spaces = () => { }, [channelManager, joinChannel]); return ( - <div className={s.root}> + <div className='bg-our-black p-4 pb-8 h-full'> {allChannels.length > 0 && ( <div className='flex items-center relative mb-2'> <SearchInput @@ -112,7 +111,7 @@ const Spaces = () => { )} <div className='space-y-1'> {allChannels.length > 0 && filteredChannels.length === 0 && ( - <p className='p-3 text-sm text-orange'> + <p className='p-3 text-sm text-orange'> {t('No channels found with your search criteria')} </p> )} @@ -123,7 +122,7 @@ const Spaces = () => { return ( <React.Fragment key={channel.id}> - <label htmlFor='mobileToggle' key={channel.id}> + <label htmlFor='mobileToggle'> <Space favorite={favorites.includes(channel.id)} missedMessagesCount={missedMessages?.[channel.id]?.length ?? 0} @@ -131,13 +130,13 @@ const Spaces = () => { date={latestMsg?.timestamp} name={channel.name} active={active} - onClick={() => { - selectChannel(channel.id); - }} + onClick={() => selectChannel(channel.id)} /> </label> <hr - className={cn('border-charcoal-4 border-1', { invisible: active || nextActive })} + className={cn('border-charcoal-4 border-1', { + invisible: active || nextActive + })} /> </React.Fragment> ); @@ -145,7 +144,7 @@ const Spaces = () => { </div> {allChannels.length === 0 && ( <div className='px-8 py-12 space-y-8'> - <img src={havenLogo.src} /> + <img src={havenLogo} alt='Haven Logo' /> <p className='text-primary text-xl leading-relaxed font-thin'> <Trans> This is the beginning of your{' '} diff --git a/src/components/common/Spaces/styles.module.scss b/src/components/common/Spaces/styles.module.scss deleted file mode 100644 index d9f4e8fe72e49e65122a3dd090e5a513aec82702..0000000000000000000000000000000000000000 --- a/src/components/common/Spaces/styles.module.scss +++ /dev/null @@ -1,11 +0,0 @@ -.root { - background-color: var(--our-black); - padding: 1rem 1rem 2rem 1rem; - height: 100%; -} - -.space.active + .divider, -.divider + .space.active, -.divider:not(:empty) { - visibility: hidden; -} diff --git a/src/components/common/Spinner/Spinner.module.scss b/src/components/common/Spinner/Spinner.module.scss deleted file mode 100644 index 5c78b2f0015018334bdf776f21800bdbdb00722c..0000000000000000000000000000000000000000 --- a/src/components/common/Spinner/Spinner.module.scss +++ /dev/null @@ -1,74 +0,0 @@ -$primary: #259cdb; -$light-color: lighten(#259cdb, 30%); -$dark-color: #259cdb; -$speed: 3s; - -@keyframes draw { - from { - fill: $light-color; - transform: translate(0, 0); - } - - 33% { - fill: $dark-color; - transform: translate(-1px, -1px); - } - - 66% { - fill: $light-color; - transform: translate(0, 0); - } - - to { - fill: $light-color; - transform: translate(0, 0); - } -} - -.stroke-1, -.stroke-2, -.stroke-3 { - animation-duration: 1.5s; - animation-name: draw; - animation-iteration-count: infinite; - animation-timing-function: ease-in; - fill: $light-color; -} - -.stroke-1, -.stroke-2, -.stroke-3 { - animation-name: draw; - fill: $light-color; -} - -.stroke-1 { - animation-delay: 0.5s; -} -.stroke-3 { - animation-delay: 1s; -} - -.spinner { - margin: 0.5rem auto; - text-align: center; - width: 30px; - - &.xs { - width: 1ch; - margin: 0 0.25rem; - display: inline; - } - - &.sm { - width: 30px; - } - - &.md { - width: 90px; - } - - &.lg { - width: 135px; - } -} diff --git a/src/components/common/Spinner/Spinner.tsx b/src/components/common/Spinner/Spinner.tsx index 5b7f5cce7315976024c88058c1d2893fb866c094..30d15ba0aaca2a11310e0fb09bbe83b95945c72c 100644 --- a/src/components/common/Spinner/Spinner.tsx +++ b/src/components/common/Spinner/Spinner.tsx @@ -1,37 +1,64 @@ import { FC, HTMLAttributes } from 'react'; import cn from 'classnames'; -import s from './Spinner.module.scss'; type Size = 'lg' | 'md' | 'sm' | 'xs'; +const sizeClasses = { + xs: 'w-[1ch] mx-1 inline', + sm: 'w-[30px]', + md: 'w-[90px]', + lg: 'w-[135px]' +}; + const Spinner: FC<{ size?: Size } & HTMLAttributes<SVGSVGElement>> = ({ size = 'sm', + className, ...props }) => { return ( <svg {...props} - className={cn(s.spinner, s[size], props.className)} + className={cn('my-2 mx-auto text-center', sizeClasses[size], className)} xmlns='http://www.w3.org/2000/svg' viewBox='0 0 61.03 67.69' > <g id='Layer_2' data-name='Layer 2'> <g id='Layer_1-2' data-name='Layer 1'> <path - className={s['stroke-1']} - fill='#fff' + fill='#9acbe8' d='M45.9,13.44a26.38,26.38,0,0,1,2.39,11c0,.12,0,.24,0,.37L61,13.48V0Z' - /> + > + <animate + attributeName='fill' + values='#9acbe8;#259cdb;#9acbe8' + dur='1.5s' + begin='0.5s' + repeatCount='indefinite' + /> + </path> <path - className={s['stroke-2']} - fill='#fff' + fill='#9acbe8' d='M44.26,24.41C44.26,11,32.22,0,17.41,0V10.08c9,0,16.41,6.14,16.74,13.8L27.31,30A26.8,26.8,0,0,1,30.73,40.4L36.83,35C41.17,43.16,50.39,48.82,61,48.82V38.75C51.78,38.75,44.26,32.32,44.26,24.41Z' - /> + > + <animate + attributeName='fill' + values='#9acbe8;#259cdb;#9acbe8' + dur='1.5s' + repeatCount='indefinite' + /> + </path> <path - className={s['stroke-3']} - fill='#fff' + fill='#9acbe8' d='M26.85,43.21C26.85,29.75,14.8,18.8,0,18.8V28.88c7.86,0,14.45,4.65,16.26,10.89l-3.54,3.15h0L5.39,49.43h0L0,54.22V67.69L18.33,51.41C22.05,60.85,32,67.62,43.62,67.62V57.55C34.37,57.55,26.85,51.12,26.85,43.21Z' - /> + > + <animate + attributeName='fill' + values='#9acbe8;#259cdb;#9acbe8' + dur='1.5s' + begin='1s' + repeatCount='indefinite' + /> + </path> </g> </g> </svg> diff --git a/src/components/common/WarningComponent/index.tsx b/src/components/common/WarningComponent/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..5daf773f51c31e6dfa364ce716fb654e21ac5955 --- /dev/null +++ b/src/components/common/WarningComponent/index.tsx @@ -0,0 +1,20 @@ +import { FC, type PropsWithChildren } from 'react'; + +const WarningComponent: FC<PropsWithChildren> = ({ children }) => { + return ( + <div className='h-screen w-full flex justify-center items-center px-20'> + <h1 + className='headline m-auto text-center' + style={{ + fontSize: '48px', + color: 'var(--cyan)', + lineHeight: '1.2' + }} + > + {children} + </h1> + </div> + ); +}; + +export default WarningComponent; diff --git a/src/components/common/WebAssemblyRunner/WebAssemblyRunner.tsx b/src/components/common/WebAssemblyRunner/WebAssemblyRunner.tsx index 58b5df5b31b906b84fb085ead1aca7a00ffe2f85..8015a1821789397e9aef3bff4092dcb0e2fbc3af 100644 --- a/src/components/common/WebAssemblyRunner/WebAssemblyRunner.tsx +++ b/src/components/common/WebAssemblyRunner/WebAssemblyRunner.tsx @@ -1,11 +1,11 @@ -import type { WithChildren } from '@types'; +import type { WithChildren } from 'src/types'; import { FC, useEffect } from 'react'; +//import { useLocation } from 'react-router-dom'; import { InitXXDK, setXXDKBasePath } from 'xxdk-wasm'; import { useUtils } from 'src/contexts/utils-context'; -import { useRouter } from 'next/router'; type Logger = { StopLogging: () => void; @@ -27,9 +27,9 @@ declare global { } const WebAssemblyRunner: FC<WithChildren> = ({ children }) => { - const router = useRouter(); + //const location = useLocation(); - const getLink = (origin: string, path: string) => `${origin}${router.basePath}${path}`; + const getLink = (origin: string, path: string) => `${origin}${path}`; const { setUtils, setUtilsLoaded, utilsLoaded } = useUtils(); const basePath = getLink(window.location.origin, '/xxdk-wasm'); @@ -45,7 +45,7 @@ const WebAssemblyRunner: FC<WithChildren> = ({ children }) => { // NOTE: NextJS hackery, since they can't seem to provide a helper to get a proper origin... setXXDKBasePath(basePath); - // eslint-disable-next-line @typescript-eslint/no-explicit-any + InitXXDK().then(async (result: any) => { setUtils(result); setUtilsLoaded(true); diff --git a/src/components/icons/ArrowUp.tsx b/src/components/icons/ArrowUp.tsx index f9e3d2f50519d874b09afd9dd51d901192f65930..394622fe5cef4653928bb4417d28e248f7c06df6 100644 --- a/src/components/icons/ArrowUp.tsx +++ b/src/components/icons/ArrowUp.tsx @@ -7,9 +7,7 @@ const ArrowDown = (props: SVGProps<SVGSVGElement>) => ( viewBox='0 0 7 5' fill='none' xmlns='http://www.w3.org/2000/svg' - style={{ - transform: 'scale(1,-1)' - }} + className='scale-y-[-1]' {...props} > <path d='M4 5L7 1.45309V0L4 3.5L0.935298 0L1 1.45309L4 5Z' fill='#95989E' /> diff --git a/src/components/icons/CommentSlash.tsx b/src/components/icons/CommentSlash.tsx index 6f44bf814601328546287fb9d5226703ac41e70b..93ccffc0eee59cf554417c41168d82b77b22d3b7 100644 --- a/src/components/icons/CommentSlash.tsx +++ b/src/components/icons/CommentSlash.tsx @@ -1,9 +1,6 @@ +import { MessageSquareOff } from 'lucide-react'; import { FC } from 'react'; -import { FontAwesomeIcon, FontAwesomeIconProps } from '@fortawesome/react-fontawesome'; -import { faCommentSlash } from '@fortawesome/free-solid-svg-icons'; -const CommentSlash: FC<Omit<FontAwesomeIconProps, 'icon'>> = (props) => ( - <FontAwesomeIcon {...props} icon={faCommentSlash} /> -); +const CommentSlash: FC = (props) => <MessageSquareOff {...props} />; export default CommentSlash; diff --git a/src/components/icons/Delete.module.scss b/src/components/icons/Delete.module.scss deleted file mode 100644 index e2ae0a72ad80898c3de8e0884c8e463dd6be5d23..0000000000000000000000000000000000000000 --- a/src/components/icons/Delete.module.scss +++ /dev/null @@ -1,6 +0,0 @@ -.root { - &:hover { - transform: scale(1.1); - } - cursor: pointer; -} diff --git a/src/components/icons/DoubleRightArrows.tsx b/src/components/icons/DoubleRightArrows.tsx index bc99783bb42405183eb789a03f59e1a6e895dc66..76dbbc11ca83d93c0c9e046e4b0bd7e33083dac4 100644 --- a/src/components/icons/DoubleRightArrows.tsx +++ b/src/components/icons/DoubleRightArrows.tsx @@ -7,9 +7,7 @@ const DoubleRightyArrows = (props: SVGProps<SVGSVGElement>) => ( viewBox='0 0 19 17' fill='none' xmlns='http://www.w3.org/2000/svg' - style={{ - transform: 'scale(-1,1)' - }} + className='scale-x-[-1]' {...props} > <path diff --git a/src/components/icons/EmojisPicker.module.scss b/src/components/icons/EmojisPicker.module.scss deleted file mode 100644 index e2ae0a72ad80898c3de8e0884c8e463dd6be5d23..0000000000000000000000000000000000000000 --- a/src/components/icons/EmojisPicker.module.scss +++ /dev/null @@ -1,6 +0,0 @@ -.root { - &:hover { - transform: scale(1.1); - } - cursor: pointer; -} diff --git a/src/components/icons/Haven.module.scss b/src/components/icons/Haven.module.scss deleted file mode 100644 index e12562fbe25991796a288f45123fd9d7eb422e06..0000000000000000000000000000000000000000 --- a/src/components/icons/Haven.module.scss +++ /dev/null @@ -1,5 +0,0 @@ -.root { - transform: scale(1.5); - width: 100%; - // margin-bottom: -10px; -} diff --git a/src/components/icons/Haven.tsx b/src/components/icons/Haven.tsx index 07f5650a2c44a81662fdf60527abf11c195d9ec4..1dbf9e73186fbb72ef338415472575e977c6baa1 100644 --- a/src/components/icons/Haven.tsx +++ b/src/components/icons/Haven.tsx @@ -1,10 +1,8 @@ import { SVGProps } from 'react'; -import s from './Haven.module.scss'; - const Haven = (props: SVGProps<SVGSVGElement>) => ( <svg - className={s.root} + className={`scale-150 w-full ${props.className || ''}`} width='151' height='22' viewBox='0 0 151 22' diff --git a/src/components/icons/Italics.tsx b/src/components/icons/Italics.tsx index 05f79842150fc0ba76e99a46311ae2d7b605037e..c774e6c0efbdb50225dc11b80b75b6573bb2574a 100644 --- a/src/components/icons/Italics.tsx +++ b/src/components/icons/Italics.tsx @@ -14,7 +14,7 @@ const Italics = (props: SVGProps<SVGSVGElement>) => { <path id='vector' fillRule='evenodd' - clip-rule='evenodd' + clipRule='evenodd' d='M14.0359 3.00009H11.0442C11.0386 2.99997 11.0331 2.99997 11.0276 3.00009H7.6073C7.40019 3.00009 7.2323 3.16799 7.2323 3.37509C7.2323 3.5822 7.40019 3.75009 7.6073 3.75009H10.4898L6.49255 14.143H3.75C3.54289 14.143 3.375 14.3108 3.375 14.518C3.375 14.7251 3.54289 14.893 3.75 14.893H6.74107C6.74705 14.8931 6.75302 14.8931 6.75898 14.893H10.1786C10.3857 14.893 10.5536 14.7251 10.5536 14.518C10.5536 14.3108 10.3857 14.143 10.1786 14.143H7.29612L11.2934 3.75009H14.0359C14.243 3.75009 14.4109 3.5822 14.4109 3.37509C14.4109 3.16799 14.243 3.00009 14.0359 3.00009Z' fill='currentColor' /> diff --git a/src/components/icons/MissedMessagesIcon/MissedMessagesIcon.module.scss b/src/components/icons/MissedMessagesIcon/MissedMessagesIcon.module.scss deleted file mode 100644 index 4d0c7102a8bc7cb2e8c85fad34aaa711c13f1d1e..0000000000000000000000000000000000000000 --- a/src/components/icons/MissedMessagesIcon/MissedMessagesIcon.module.scss +++ /dev/null @@ -1,26 +0,0 @@ -.bubble { - display: block; - cursor: pointer; - - &:after { - background-color: var(--cyan); - } -} - -.bubble { - &:hover:after { - background-color: var(--cyan); - } -} - -.bubble:after { - content: ''; - width: 8px; - height: 8px; - border-radius: 50%; - display: block; -} - -.muted:after { - background-color: var(--text-muted); -} diff --git a/src/components/icons/MissedMessagesIcon/MissedMessagesIcon.tsx b/src/components/icons/MissedMessagesIcon/MissedMessagesIcon.tsx index 87ad96bae2480d80f47efd5bd164411fcb28b461..3ee7ced14301aa8979f4c677295c56beeedaec24 100644 --- a/src/components/icons/MissedMessagesIcon/MissedMessagesIcon.tsx +++ b/src/components/icons/MissedMessagesIcon/MissedMessagesIcon.tsx @@ -1,11 +1,18 @@ import { FC } from 'react'; -import s from './MissedMessagesIcon.module.scss'; import cn from 'classnames'; const MissedMessagesIcon: FC<{ muted?: boolean }> = ({ muted }) => { return ( - <div className={cn('flex items-center')}> - <div className={cn(s.bubble, { [s.muted]: muted })}></div> + <div className='flex items-center'> + <div + className={cn( + 'block cursor-pointer after:block after:w-2 after:h-2 after:rounded-full', + 'after:bg-[var(--cyan)] hover:after:bg-[var(--cyan)]', + { + 'after:bg-[var(--text-muted)]': muted + } + )} + ></div> </div> ); }; diff --git a/src/components/icons/Mute.module.scss b/src/components/icons/Mute.module.scss deleted file mode 100644 index e2ae0a72ad80898c3de8e0884c8e463dd6be5d23..0000000000000000000000000000000000000000 --- a/src/components/icons/Mute.module.scss +++ /dev/null @@ -1,6 +0,0 @@ -.root { - &:hover { - transform: scale(1.1); - } - cursor: pointer; -} diff --git a/src/components/icons/Mute.tsx b/src/components/icons/Mute.tsx index f2d27f72296506657f13dcbb6d4acdb3fed802e7..179795951e7559bd8169e2972ee3d5c5bd70b498 100644 --- a/src/components/icons/Mute.tsx +++ b/src/components/icons/Mute.tsx @@ -7,6 +7,7 @@ const Mute = (props: SVGProps<SVGSVGElement>) => ( viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg' + className='hover:scale-110 cursor-pointer transition-transform' {...props} > <g id='Icon'> diff --git a/src/components/icons/NetworkStatusIcon/NetworkStatusIcon.module.scss b/src/components/icons/NetworkStatusIcon/NetworkStatusIcon.module.scss deleted file mode 100644 index 34607aaefe38f2bfb4ec3299ed5e44d9a043eb43..0000000000000000000000000000000000000000 --- a/src/components/icons/NetworkStatusIcon/NetworkStatusIcon.module.scss +++ /dev/null @@ -1,40 +0,0 @@ -.bubble { - display: block; - cursor: pointer; - - &__connected:after { - background-color: greenyellow; - } - &__connecting:after { - background-color: var(--primary); - } - &__failed:after { - background-color: var(--red); - } - &__disconnected:after { - background-color: var(--dark-6); - } -} - -.bubble { - &__connected:hover:after { - background-color: greenyellow; - } - &__connecting:hover:after { - background-color: var(--primary); - } - &__failed:hover:after { - background-color: var(--red); - } - &__disconnected:hover:after { - background-color: var(--dark-6); - } -} - -.bubble:after { - content: ''; - width: 8px; - height: 8px; - border-radius: 50%; - display: block; -} diff --git a/src/components/icons/NetworkStatusIcon/NetworkStatusIcon.tsx b/src/components/icons/NetworkStatusIcon/NetworkStatusIcon.tsx index 2b5ebd7643e7fb3e3fcc614a56d13169179ae941..e3282221ab6d83684df18f28e11c94b4cd44e859 100644 --- a/src/components/icons/NetworkStatusIcon/NetworkStatusIcon.tsx +++ b/src/components/icons/NetworkStatusIcon/NetworkStatusIcon.tsx @@ -1,6 +1,4 @@ import { FC } from 'react'; - -import s from './NetworkStatusIcon.module.scss'; import cn from 'classnames'; import { useNetworkClient } from 'src/contexts/network-client-context'; @@ -11,13 +9,12 @@ const NetworkStatusIcon: FC = () => { return null; } else { return ( - <div className={cn('flex items-center mt-4')}> + <div className='flex items-center mt-4'> <div - className={cn( - s.bubble, - { [s.bubble__connected]: isNetworkHealthy }, - { [s.bubble__failed]: !isNetworkHealthy } - )} + className={cn('block cursor-pointer after:block after:w-2 after:h-2 after:rounded-full', { + 'after:bg-[greenyellow] hover:after:bg-[greenyellow]': isNetworkHealthy, + 'after:bg-[var(--red)] hover:after:bg-[var(--red)]': !isNetworkHealthy + })} ></div> </div> ); diff --git a/src/components/icons/NormalHaven.tsx b/src/components/icons/NormalHaven.tsx index 08d0af08c9b00fab1e71ccb065f9e4f193273155..d3c412c0b6fcefcd4d04d818a333269480070cbd 100644 --- a/src/components/icons/NormalHaven.tsx +++ b/src/components/icons/NormalHaven.tsx @@ -7,10 +7,10 @@ const NormalHaven = () => { fill='none' xmlns='http://www.w3.org/2000/svg' > - <g clip-path='url(#clip0_892_19101)'> + <g clipPath='url(#clip0_892_19101)'> <path - fill-rule='evenodd' - clip-rule='evenodd' + fillRule='evenodd' + clipRule='evenodd' d='M46.637 25.5904V6.85734C46.637 3.07022 43.5576 0 39.7593 0H6.87769C3.07933 0 0 3.07022 0 6.85734V25.5872C0 29.3744 3.07933 32.4446 6.87769 32.4446H20.8363L31.1934 38.1985C31.5061 38.3731 31.8906 38.1487 31.8906 37.7902V14.9958C31.8906 14.8274 31.7999 14.6716 31.6499 14.5874L20.8363 8.58103H37.721C37.8929 8.58103 38.0336 8.7213 38.0336 8.89273V32.2919C38.0336 32.3791 38.1024 32.4477 38.1899 32.4477H39.7593C43.5576 32.4477 46.637 29.3775 46.637 25.5904ZM85.3177 30.0882V18.6239L85.3146 18.627C85.3146 12.5926 81.7382 9.85899 76.9144 9.85899C74.1258 9.85899 71.753 10.7567 70.2087 12.4056V2.28786H65.5006V30.0913H70.2087V19.9736C70.2087 15.9651 72.4689 13.9422 75.8234 13.9422C78.8402 13.9422 80.6096 15.6659 80.6096 19.2255V30.0882H85.3177ZM107.395 18.3683V30.0913H102.95V27.6569C101.818 29.3806 99.6327 30.3531 96.619 30.3531C92.0234 30.3531 89.1223 27.8439 89.1223 24.3592C89.1223 20.8744 91.3826 18.4026 97.4849 18.4026H102.684V18.1034C102.684 15.3667 101.027 13.7583 97.6725 13.7583C95.4123 13.7583 93.077 14.5064 91.5701 15.7438L89.7225 12.3339C91.8703 10.685 94.9965 9.86211 98.2384 9.86211C104.041 9.86211 107.395 12.5957 107.395 18.3683ZM102.687 23.8324V21.5102H97.8257C94.6245 21.5102 93.7554 22.7103 93.7554 24.169C93.7554 25.8553 95.1872 26.9431 97.5975 26.9431C100.008 26.9431 101.893 25.8927 102.684 23.8324H102.687ZM122.501 30.0913L131.129 10.0834H131.126H126.606L120.163 24.9202L113.91 10.0834H109.011L117.64 30.0913H122.501ZM152.341 21.5851H152.338C152.375 21.1367 152.413 20.5743 152.413 20.2011C152.413 13.9422 148.23 9.85899 142.24 9.85899C136.25 9.85899 131.842 14.1292 131.842 20.0889C131.842 26.0486 136.213 30.3562 142.956 30.3562C146.423 30.3562 149.249 29.231 151.056 27.0959L148.533 24.2095C147.104 25.6714 145.332 26.3821 143.072 26.3821C139.567 26.3821 137.119 24.5088 136.553 21.5851H152.338L152.338 21.5882L152.341 21.5851ZM136.516 18.4743H147.933C147.555 15.588 145.332 13.6025 142.243 13.6025C139.154 13.6025 136.969 15.5506 136.516 18.4743ZM176 30.0882V18.6239H175.997C175.997 12.5895 172.42 9.85587 167.597 9.85587C164.658 9.85587 162.21 10.8315 160.666 12.6674V10.0834H156.183V30.0913H160.891V19.9736C160.891 15.9651 163.151 13.9422 166.506 13.9422C169.522 13.9422 171.292 15.6659 171.292 19.2255V30.0882H176Z' fill='#ECBA60' /> diff --git a/src/components/icons/Reply.module.scss b/src/components/icons/Reply.module.scss deleted file mode 100644 index e2ae0a72ad80898c3de8e0884c8e463dd6be5d23..0000000000000000000000000000000000000000 --- a/src/components/icons/Reply.module.scss +++ /dev/null @@ -1,6 +0,0 @@ -.root { - &:hover { - transform: scale(1.1); - } - cursor: pointer; -} diff --git a/src/components/icons/Reply.tsx b/src/components/icons/Reply.tsx index 979617b8da6dad66fc2db5fb4e54570570e96888..8c0ee0ac12877038da869778bc5ed107095679d3 100644 --- a/src/components/icons/Reply.tsx +++ b/src/components/icons/Reply.tsx @@ -7,6 +7,7 @@ const Reply = (props: SVGProps<SVGSVGElement>) => ( viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg' + className='hover:scale-110 cursor-pointer transition-transform' {...props} > <g id='Icon'> diff --git a/src/components/icons/RightFromBracket.tsx b/src/components/icons/RightFromBracket.tsx index 53375b65e0635f47a3d2f20d425decd5c175df4a..79c888610e54a359e1478b3670a6db2464969329 100644 --- a/src/components/icons/RightFromBracket.tsx +++ b/src/components/icons/RightFromBracket.tsx @@ -1,9 +1,6 @@ import { FC } from 'react'; -import { FontAwesomeIcon, FontAwesomeIconProps } from '@fortawesome/react-fontawesome'; -import { faRightFromBracket } from '@fortawesome/free-solid-svg-icons'; +import { LogOut, LucideProps } from 'lucide-react'; -const RightFromBracket: FC<Omit<FontAwesomeIconProps, 'icon'>> = (props) => ( - <FontAwesomeIcon {...props} icon={faRightFromBracket} /> -); +const RightFromBracket: FC<LucideProps> = (props) => <LogOut {...props} />; export default RightFromBracket; diff --git a/src/components/icons/Slash.tsx b/src/components/icons/Slash.tsx index c43394f9703e228474d5da91a35a2167171816cd..a84fb256954f3d832dbb52b25878b863fc70d419 100644 --- a/src/components/icons/Slash.tsx +++ b/src/components/icons/Slash.tsx @@ -1,9 +1,6 @@ import { FC } from 'react'; -import { FontAwesomeIcon, FontAwesomeIconProps } from '@fortawesome/react-fontawesome'; -import { faXmark } from '@fortawesome/free-solid-svg-icons'; +import { X, LucideProps } from 'lucide-react'; -const Slash: FC<Omit<FontAwesomeIconProps, 'icon'>> = (props) => ( - <FontAwesomeIcon {...props} icon={faXmark} /> -); +const Slash: FC<LucideProps> = (props) => <X {...props} />; export default Slash; diff --git a/src/components/icons/Unpin.module.scss b/src/components/icons/Unpin.module.scss deleted file mode 100644 index 28251cf76b67839659f62a6123a52c9caa33d505..0000000000000000000000000000000000000000 --- a/src/components/icons/Unpin.module.scss +++ /dev/null @@ -1,7 +0,0 @@ -.root { - fill: var(--red); - &:hover { - transform: scale(1.1); - } - cursor: pointer; -} diff --git a/src/components/icons/Unpin.tsx b/src/components/icons/Unpin.tsx index df172b0a3f040a7112f3bffd6add84618c826283..1803100ea28fdbc16329c99c64953230307422e0 100644 --- a/src/components/icons/Unpin.tsx +++ b/src/components/icons/Unpin.tsx @@ -1,10 +1,8 @@ import { SVGProps } from 'react'; -import s from './Mute.module.scss'; - const Pin = (props: SVGProps<SVGSVGElement>) => ( <svg - className={s.root} + className='fill-[var(--red)] hover:scale-110 cursor-pointer transition-transform' {...props} width='21' height='20' diff --git a/src/components/icons/index.ts b/src/components/icons/index.ts index 7819734cebe7ae3edc258f983c55008d8f955c3f..72ef3cbd14dc8a9458f477752e13dd2b1102a8c8 100644 --- a/src/components/icons/index.ts +++ b/src/components/icons/index.ts @@ -26,3 +26,4 @@ export { default as Haven } from './Haven'; export { default as Tree } from './Tree'; export { default as Unpin } from './Unpin'; export { default as Upload } from './Upload'; +export { default as X } from './X'; diff --git a/src/components/modals/AccountSync/index.tsx b/src/components/modals/AccountSync/index.tsx index 25b4fcebacf721f3644ad90dda525affee4a61f3..61d2e948681d386d47d384dcf8b5c7204c18498b 100644 --- a/src/components/modals/AccountSync/index.tsx +++ b/src/components/modals/AccountSync/index.tsx @@ -25,11 +25,11 @@ const AccountSyncView: FC = () => { return ( <> <ModalTitle>{t('Account Sync')}</ModalTitle> - <p> + <p className='text-sm font-medium mb-4'> Sync your account with multiple devices using the cloud with account sync. The file is encrypted so there are no privacy concerns with using these third party services. </p> - <p style={{ color: 'var(--orange)' }}> + <p className='text-orange font-bold mb-4'> <strong>Warning!</strong> Once you choose a cloud provider you will not be able to change to another service or revert to local-only. </p> @@ -38,7 +38,7 @@ const AccountSyncView: FC = () => { ) : ( <div data-testid='account-sync-buttons' className='grid grid-cols-2 gap-4 pt-4'> <div className='col-span-2 text-center'> - <Button className='' data-testid='account-sync-local-only-button' onClick={ignoreSync}> + <Button data-testid='account-sync-local-only-button' onClick={ignoreSync}> {t('Local-only')} </Button> </div> diff --git a/src/components/modals/AccountSync/styles.module.scss b/src/components/modals/AccountSync/styles.module.scss deleted file mode 100644 index 16d3d867bd0d98efa5cd0eb7721e7152425d5e61..0000000000000000000000000000000000000000 --- a/src/components/modals/AccountSync/styles.module.scss +++ /dev/null @@ -1,58 +0,0 @@ -.root { - padding-bottom: 4rem; - padding-top: 2rem; - - input[type='file'] { - display: none; - } - - input, - label { - border: none; - outline: none; - background-color: var(--dark-5); - padding: 18px 10px; - color: var(--text-primary); - font-size: 14px; - max-width: 520px; - width: 100%; - height: 55px; - border-radius: 5px; - margin-bottom: 26px; - } - - label { - cursor: pointer; - } - - p { - font-weight: 500; - font-size: 14px; - max-width: 520px; - text-align: left; - width: 100%; - } - - .button { - color: black; - } -} - -.iconStack { - width: 4rem; - height: 4rem; - position: relative; - - svg { - position: absolute; - left: 0; - right: 0; - top: 0; - bottom: 0; - margin: auto; - } -} - -.warning { - color: var(--var-orange); -} diff --git a/src/components/modals/ChannelSettingsView/ChannelSettingsView.module.scss b/src/components/modals/ChannelSettingsView/ChannelSettingsView.module.scss deleted file mode 100644 index e3203aa2f6d08632f93a7ea54e5cbfdfb8a2b4ba..0000000000000000000000000000000000000000 --- a/src/components/modals/ChannelSettingsView/ChannelSettingsView.module.scss +++ /dev/null @@ -1,27 +0,0 @@ -.root { - .wrapper { - width: 100%; - margin-bottom: 180px; - - & > div { - margin: 0 auto; - max-width: 30rem; - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 36px; - svg { - cursor: pointer; - color: var(--primary); - width: 1.5rem; - height: 1.5rem; - } - } - } -} - -.select { - background-color: var(--dark-2); - padding: 0.5rem 1rem; - border-radius: 5px; -} diff --git a/src/components/modals/ChannelSettingsView/ChannelSettingsView.tsx b/src/components/modals/ChannelSettingsView/ChannelSettingsView.tsx index 8ce2ff925c133e11b97befb1240ac54b88f4771f..a9368636d2be8029bd9325aa0fef5cc75b6ebdd4 100644 --- a/src/components/modals/ChannelSettingsView/ChannelSettingsView.tsx +++ b/src/components/modals/ChannelSettingsView/ChannelSettingsView.tsx @@ -1,21 +1,17 @@ import { ChangeEventHandler, FC, useCallback } from 'react'; -import cn from 'classnames'; import { useTranslation } from 'react-i18next'; - import { useUI } from 'src/contexts/ui-context'; import * as channels from 'src/store/channels'; import { useAppSelector } from 'src/store/hooks'; - -import s from './ChannelSettingsView.module.scss'; -import Keys from '@components/icons/Keys'; -import LockOpen from '@components/icons/LockOpen'; -import RightFromBracket from '@components/icons/RightFromBracket'; -import { useNetworkClient } from '@contexts/network-client-context'; -import CheckboxToggle from '@components/common/CheckboxToggle'; -import { Spinner } from '@components/common'; -import { ChannelNotificationLevel, NotificationStatus } from '@types'; -import { useUtils } from '@contexts/utils-context'; -import { notificationLevelDecoder, notificationStatusDecoder } from '@utils/decoders'; +import Keys from 'src/components/icons/Keys'; +import LockOpen from 'src/components/icons/LockOpen'; +import RightFromBracket from 'src/components/icons/RightFromBracket'; +import { useNetworkClient } from 'src/contexts/network-client-context'; +import CheckboxToggle from 'src/components/common/CheckboxToggle'; +import { Spinner } from 'src/components/common'; +import { ChannelNotificationLevel, NotificationStatus } from '../../../types'; +import { useUtils } from 'src/contexts/utils-context'; +import { notificationLevelDecoder, notificationStatusDecoder } from 'src/utils/decoders'; const ChannelSettingsView: FC = () => { const { t } = useTranslation(); @@ -37,7 +33,7 @@ const ChannelSettingsView: FC = () => { } const fn = dmsEnabled ? 'DisableDirectMessages' : 'EnableDirectMessages'; - channelManager?.[fn](Buffer.from(currentChannel.id, 'base64')); + channelManager?.[fn](new Uint8Array(Buffer.from(currentChannel.id, 'base64'))); }, [channelManager, currentChannel, dmsEnabled]); const correctInvalidNotificationStates = useCallback( @@ -102,7 +98,7 @@ const ChannelSettingsView: FC = () => { (evt) => { const level = notificationLevelDecoder.decode(parseInt(evt.target.value, 10)); if (level.isOk()) { - changeNotificationLevel(level.value); + changeNotificationLevel(level.value as unknown as ChannelNotificationLevel); } else { throw new Error(`Unknown notification level ${level.error}`); } @@ -131,7 +127,7 @@ const ChannelSettingsView: FC = () => { (evt) => { const status = notificationStatusDecoder.decode(parseInt(evt.target.value, 10)); if (status.isOk()) { - changeNotificationStatus(status.value); + changeNotificationStatus(status.value as unknown as NotificationStatus); } else { throw new Error(`Unknown notification status: ${status.error}`); } @@ -141,21 +137,23 @@ const ChannelSettingsView: FC = () => { return ( <> - <div className={cn(s.root, 'w-full flex flex-col justify-center items-center')}> + <div className='w-full flex flex-col justify-center items-center'> <h2 className='mt-9 mb-8'>{t('Channel Settings')}</h2> - <div className={s.wrapper}> - <div> - <h3 className='headline--sm'>{t('Enable Direct Messages')}</h3> + <div className='w-full mb-[180px]'> + <div className='mx-auto max-w-[30rem] flex justify-between items-center mb-9'> + <h3 className='text-sm font-medium'>{t('Enable Direct Messages')}</h3> {dmsEnabled === null ? ( <Spinner className='m-0 mr-1' /> ) : ( <CheckboxToggle checked={dmsEnabled} onChange={toggleDms} /> )} </div> + {currentChannel?.isAdmin ? ( - <div> - <h3 className='headline--sm'>{t('Export Admin Keys')}</h3> + <div className='mx-auto max-w-[30rem] flex justify-between items-center mb-9'> + <h3 className='text-sm font-medium'>{t('Export Admin Keys')}</h3> <Keys + className='cursor-pointer text-primary w-6 h-6 hover:text-primary-dark' onClick={() => { setModalView('EXPORT_ADMIN_KEYS'); openModal(); @@ -163,9 +161,10 @@ const ChannelSettingsView: FC = () => { /> </div> ) : ( - <div> - <h3 className='headline--sm'>{t('Claim Admin Keys')}</h3> + <div className='mx-auto max-w-[30rem] flex justify-between items-center mb-9'> + <h3 className='text-sm font-medium'>{t('Claim Admin Keys')}</h3> <LockOpen + className='cursor-pointer text-primary w-6 h-6 hover:text-primary-dark' onClick={() => { setModalView('CLAIM_ADMIN_KEYS'); openModal(); @@ -173,33 +172,39 @@ const ChannelSettingsView: FC = () => { /> </div> )} - <div> - <h3 className='headline--sm'>{t('Notifications')}</h3> + + <div className='mx-auto max-w-[30rem] flex justify-between items-center mb-9'> + <h3 className='text-sm font-medium'>{t('Notifications')}</h3> <select onChange={onNotificationStatusChange} value={notificationStatus} id='notification-levels' + className='bg-dark-2 px-4 py-2 rounded border-none outline-none text-sm' > <option value={NotificationStatus.WhenOpen}>When Open</option> - <option value={NotificationStatus.Push}>Push</option> + <option value={NotificationStatus.All}>All</option> <option value={NotificationStatus.Mute}>Mute</option> </select> </div> - <div> - <h3 className='headline--sm'>{t('Notification Level')}</h3> + + <div className='mx-auto max-w-[30rem] flex justify-between items-center mb-9'> + <h3 className='text-sm font-medium'>{t('Notification Level')}</h3> <select onChange={onNotificationLevelChange} value={notificationLevel} id='notification-levels' + className='bg-dark-2 px-4 py-2 rounded border-none outline-none text-sm' > <option value={ChannelNotificationLevel.NotifyAll}>All</option> <option value={ChannelNotificationLevel.NotifyPing}>Tags, replies, and pins</option> <option value={ChannelNotificationLevel.NotifyNone}>None</option> </select> </div> - <div> - <h3 className='headline--sm'>{t('Leave Channel')}</h3> + + <div className='mx-auto max-w-[30rem] flex justify-between items-center mb-9'> + <h3 className='text-sm font-medium'>{t('Leave Channel')}</h3> <RightFromBracket + className='cursor-pointer text-primary w-6 h-6 hover:text-primary-dark' onClick={() => { if (currentChannel) { setModalView('LEAVE_CHANNEL_CONFIRMATION'); diff --git a/src/components/modals/ClaimAdminKeys/styles.module.scss b/src/components/modals/ClaimAdminKeys/styles.module.scss deleted file mode 100644 index 4c782153c95dbc36e38f25e8cfce9a27971d8298..0000000000000000000000000000000000000000 --- a/src/components/modals/ClaimAdminKeys/styles.module.scss +++ /dev/null @@ -1,40 +0,0 @@ -.root { - padding: 4rem; - - input[type='file'] { - display: none; - } - - input, - label { - border: none; - outline: none; - background-color: var(--dark-5); - padding: 18px 10px; - color: var(--text-primary); - font-size: 14px; - max-width: 520px; - width: 100%; - height: 55px; - border-radius: 5px; - margin-bottom: 26px; - } - - label { - cursor: pointer; - } - - p { - font-weight: 500; - font-size: 12px; - line-height: 15px; - color: var(--cyan); - max-width: 520px; - text-align: left; - width: 100%; - } - - .button { - color: black; - } -} diff --git a/src/components/modals/CreateChannelView/CreateChannelView.tsx b/src/components/modals/CreateChannelView/CreateChannelView.tsx index bc06e8885d9e18ac9f5e35eb8a8ff42d151b1ac1..ddb25b95a2114b9fe7ae79b4ccf5955f366701d0 100644 --- a/src/components/modals/CreateChannelView/CreateChannelView.tsx +++ b/src/components/modals/CreateChannelView/CreateChannelView.tsx @@ -6,7 +6,7 @@ import cn from 'classnames'; import { useNetworkClient } from 'src/contexts/network-client-context'; import { useUI } from 'src/contexts/ui-context'; import useInput from 'src/hooks/useInput'; -import { PrivacyLevel } from '@types'; +import { PrivacyLevel } from '../../../types'; import CheckboxToggle from '@components/common/CheckboxToggle'; import Input from '@components/common/Input'; import ModalTitle from '../ModalTitle'; @@ -64,7 +64,6 @@ const CreateChannelView: FC = () => { setChannelDesc(''); closeModal(); } catch (e) { - // eslint-disable-next-line @typescript-eslint/no-explicit-any console.error((e as any).message); alert({ type: 'error', diff --git a/src/components/modals/DeleteMessage/DeleteMessage.module.scss b/src/components/modals/DeleteMessage/DeleteMessage.module.scss deleted file mode 100644 index d6e36c660f559c1f06210a1f81505555787f6a33..0000000000000000000000000000000000000000 --- a/src/components/modals/DeleteMessage/DeleteMessage.module.scss +++ /dev/null @@ -1,11 +0,0 @@ -.buttonGroup { - margin-left: -0.5rem; - margin-right: -0.5rem; - display: flex; - flex-wrap: wrap; - justify-content: center; - - & > button { - margin: 0.5rem 0.75rem; - } -} diff --git a/src/components/modals/DeleteMessage/index.tsx b/src/components/modals/DeleteMessage/index.tsx index da39e62473d432b1fe5ae144d110547574131ffb..af25e810d85444e2adb356041854ef6a9a0e88a7 100644 --- a/src/components/modals/DeleteMessage/index.tsx +++ b/src/components/modals/DeleteMessage/index.tsx @@ -1,13 +1,7 @@ -import { FC } from 'react'; -import cn from 'classnames'; - +import { FC, useCallback, useState } from 'react'; import { useTranslation } from 'react-i18next'; -import { useCallback, useState } from 'react'; - import { Button } from 'src/components/common'; import Modal from 'src/components/modals/Modal'; - -import s from './DeleteMessage.module.scss'; import ModalTitle from '../ModalTitle'; type Props = { @@ -32,11 +26,13 @@ const DeleteMessageModal: FC<Props> = ({ onCancel, onConfirm }) => { <p className='mb-4 text-red uppercase text-center'> ** {t('Important to note that deleting messages cannot be undone.')} ** </p> - <div className={cn('mb-6', s.buttonGroup)}> - <Button variant='outlined' onClick={onCancel}> + <div className='flex flex-wrap justify-center -mx-2'> + <Button variant='outlined' className='m-2' onClick={onCancel}> {t('Cancel')} </Button> - <Button onClick={handleConfirmation}>{t('Delete')}</Button> + <Button className='m-2' onClick={handleConfirmation}> + {t('Delete')} + </Button> </div> </Modal> ); diff --git a/src/components/modals/ExportAdminKeys/index.tsx b/src/components/modals/ExportAdminKeys/index.tsx index be3608f491cd33a7162abc9978328244c8e053d9..2e93784ec4926b467424947c07fc488570caa8e3 100644 --- a/src/components/modals/ExportAdminKeys/index.tsx +++ b/src/components/modals/ExportAdminKeys/index.tsx @@ -11,11 +11,10 @@ import { useNetworkClient } from 'src/contexts/network-client-context'; import * as channels from 'src/store/channels'; import { useAppSelector } from 'src/store/hooks'; -import s from './styles.module.scss'; import ModalTitle from '../ModalTitle'; -import Input from '@components/common/Input'; -import { useUI } from '@contexts/ui-context'; -import Keys from '@components/icons/Keys'; +import Input from 'src/components/common/Input'; +import { useUI } from 'src/contexts/ui-context'; +import Keys from 'src/components/icons/Keys'; const ExportCodenameView: FC = () => { const { t } = useTranslation(); @@ -82,7 +81,7 @@ const ExportCodenameView: FC = () => { value={password} onChange={setPassword} /> - <Button className={cn('mt-5', s.button)} onClick={checkPassword}> + <Button className={cn('mt-5')} onClick={checkPassword}> {t('Unlock')} </Button> </> diff --git a/src/components/modals/ExportAdminKeys/styles.module.scss b/src/components/modals/ExportAdminKeys/styles.module.scss deleted file mode 100644 index 6a299c25ff3e884e32c940812dfd1344b6c1cb90..0000000000000000000000000000000000000000 --- a/src/components/modals/ExportAdminKeys/styles.module.scss +++ /dev/null @@ -1,17 +0,0 @@ -.root { - padding: 4rem; - - p { - font-weight: 500; - font-size: 12px; - line-height: 15px; - color: var(--cyan); - max-width: 520px; - text-align: left; - width: 100%; - } - - .button { - color: black; - } -} diff --git a/src/components/modals/ExportCodenameView/ExportCodenameView.module.scss b/src/components/modals/ExportCodenameView/ExportCodenameView.module.scss deleted file mode 100644 index 3c8b2aa49480ab269ac43e10021b995e0bcc3e15..0000000000000000000000000000000000000000 --- a/src/components/modals/ExportCodenameView/ExportCodenameView.module.scss +++ /dev/null @@ -1,16 +0,0 @@ -.root { - p { - font-weight: 500; - font-size: 12px; - line-height: 15px; - color: var(--cyan); - max-width: 520px; - text-align: left; - width: 100%; - } - - .button { - color: black; - margin-bottom: 120px; - } -} diff --git a/src/components/modals/ExportCodenameView/ExportCodenameView.tsx b/src/components/modals/ExportCodenameView/ExportCodenameView.tsx index c14edbb4c3e4fa37e86ee9035f27792d3ece22fb..03dbdef955899368fa6e94215cb39adff90d8324 100644 --- a/src/components/modals/ExportCodenameView/ExportCodenameView.tsx +++ b/src/components/modals/ExportCodenameView/ExportCodenameView.tsx @@ -1,8 +1,5 @@ import { FC, useCallback, useState } from 'react'; -import cn from 'classnames'; import { useTranslation } from 'react-i18next'; - -import s from './ExportCodenameView.module.scss'; import { Button } from 'src/components/common'; import { useNetworkClient } from 'src/contexts/network-client-context'; import { useUI } from 'src/contexts/ui-context'; @@ -27,9 +24,9 @@ const ExportCodenameView: FC = () => { }, [t, closeModal, exportPrivateIdentity, password]); return ( - <div className={cn('w-full flex flex-col justify-center items-center', s.root)}> + <div className='w-full flex flex-col justify-center items-center'> <h2 className='mt-9 mb-4'>{t('Export codename')}</h2> - <p className='mb-8'> + <p className='mb-8 font-medium text-xs leading-tight text-cyan max-w-[520px] text-left w-full'> {t(`You can export your codename for backup or to use your codename on a second device.`)} </p> @@ -45,14 +42,11 @@ const ExportCodenameView: FC = () => { onChange={(e) => { setPassword(e.target.value); }} + className='border-none outline-none bg-dark-5 px-2.5 py-4.5 text-text-primary text-sm w-full max-w-[520px] h-[55px] rounded mb-6.5' /> - {error && ( - <div className={'text text--xs mt-2'} style={{ color: 'var(--red)' }}> - {error} - </div> - )} - <Button className={cn('mt-5', s.button)} onClick={handleSubmit}> + {error && <div className='text-xs mt-2 text-red'>{error}</div>} + <Button className='mt-5 text-black mb-30' onClick={handleSubmit}> {t('Export')} </Button> </div> diff --git a/src/components/modals/ImportAccountView/ImportAccountForm/ImportAccountForm.module.scss b/src/components/modals/ImportAccountView/ImportAccountForm/ImportAccountForm.module.scss deleted file mode 100644 index 9c7d6c2e7cba605975883d97975fcf78a604ca63..0000000000000000000000000000000000000000 --- a/src/components/modals/ImportAccountView/ImportAccountForm/ImportAccountForm.module.scss +++ /dev/null @@ -1,39 +0,0 @@ -.root { - min-height: 476px; - input[type='file'] { - display: none; - } - input, - label { - border: none; - outline: none; - background-color: var(--dark-5); - padding: 18px 10px; - color: var(--text-primary); - font-size: 14px; - max-width: 520px; - width: 100%; - height: 55px; - border-radius: 5px; - margin-bottom: 26px; - } - - label { - cursor: pointer; - } - - p { - font-weight: 500; - font-size: 11px; - line-height: 13px; - color: var(--cyan); - max-width: 520px; - text-align: left; - width: 100%; - } - - .button { - color: black; - margin-bottom: 120px; - } -} diff --git a/src/components/modals/ImportAccountView/ImportAccountForm/ImportAccountForm.tsx b/src/components/modals/ImportAccountView/ImportAccountForm/ImportAccountForm.tsx index 31a07702e4b943eb69b1f3f9605e941b1129bd33..df72227620d308ef1a8ff4a9287ac2be06087b31 100644 --- a/src/components/modals/ImportAccountView/ImportAccountForm/ImportAccountForm.tsx +++ b/src/components/modals/ImportAccountView/ImportAccountForm/ImportAccountForm.tsx @@ -1,12 +1,8 @@ import React, { FC, useState, useRef, useCallback } from 'react'; -import cn from 'classnames'; import { useTranslation } from 'react-i18next'; - import { Upload } from 'src/components/icons'; import { Button } from 'src/components/common'; -import s from './ImportAccountForm.module.scss'; - type Props = { onSubmit: (value: { password: string; identity: string }) => Promise<void>; }; @@ -48,25 +44,33 @@ const ImportAccountForm: FC<Props> = ({ onSubmit }) => { }, []); return ( - <form onSubmit={handleSubmission} className={cn('w-full flex flex-col items-center', s.root)}> + <form className='w-full flex flex-col items-center min-h-[476px]' onSubmit={handleSubmission}> <h2 className='mt-9 mb-4'>{t('Import your account')}</h2> - <p className='mb-8'> + <p className='mb-8 font-medium text-xs leading-tight text-cyan max-w-[520px] text-left w-full'> {t(`Note that importing your account will only restore your codename. You need to rejoin manually any previously joined channel`)} </p> - {error && ( - <div className={'text text--xs mt-2'} style={{ color: 'var(--red)' }}> - {error} - </div> - )} + {error && <div className='text-xs mt-2 text-red'>{error}</div>} <input required id='identityFile' type='file' placeholder={t('Choose a file')} onChange={onFileChange} + className='hidden' /> - <label htmlFor='identityFile' className='flex justify-between'> + <label + htmlFor='identityFile' + className=' + flex justify-between + border-none outline-none + bg-dark-5 px-2.5 py-[18px] + text-text-primary text-sm + w-full max-w-[520px] h-[55px] + rounded mb-[26px] + cursor-pointer + ' + > <span ref={fileInputLabelRef}>{t('Choose a file')}</span> <Upload /> </label> @@ -78,8 +82,15 @@ const ImportAccountForm: FC<Props> = ({ onSubmit }) => { onChange={(e) => { setPassword(e.target.value); }} + className=' + border-none outline-none + bg-dark-5 px-2.5 py-[18px] + text-text-primary text-sm + w-full max-w-[520px] h-[55px] + rounded mb-[26px] + ' /> - <Button type='submit' className={cn('mt-5', s.button)}> + <Button type='submit' className='mt-5 text-black mb-30'> {t('Import')} </Button> </form> diff --git a/src/components/modals/JoinChannelSuccessView/JoinChannelSuccessView.module.scss b/src/components/modals/JoinChannelSuccessView/JoinChannelSuccessView.module.scss deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/src/components/modals/JoinChannelSuccessView/JoinChannelSuccessView.tsx b/src/components/modals/JoinChannelSuccessView/JoinChannelSuccessView.tsx index 3050ebcf8d78a39d1e70efc3ca5b857080cbc302..c2592b35b1fe51cfd7d74f491179d248b1297b50 100644 --- a/src/components/modals/JoinChannelSuccessView/JoinChannelSuccessView.tsx +++ b/src/components/modals/JoinChannelSuccessView/JoinChannelSuccessView.tsx @@ -1,14 +1,11 @@ import { FC } from 'react'; -import cn from 'classnames'; import { useTranslation } from 'react-i18next'; -import s from './JoinChannelSuccessView.module.scss'; - const JoinChannelSuccessView: FC = () => { const { t } = useTranslation(); return ( - <div className={cn('w-full flex flex-col justify-center items-center', s.root)}> - <span className='text font-bold mt-9 mb-4'> + <div className='w-full flex flex-col justify-center items-center'> + <span className='text-base font-bold mt-9 mb-4'> {t('Awesome! You joined a new Haven Chat successfully.')} </span> </div> diff --git a/src/components/modals/JoinChannelView/JoinChannelView.tsx b/src/components/modals/JoinChannelView/JoinChannelView.tsx index f9be8be1d53e683165ecd8898b0092c45ec53104..08075d1a2d79108de58db4cc709c901f650685bf 100644 --- a/src/components/modals/JoinChannelView/JoinChannelView.tsx +++ b/src/components/modals/JoinChannelView/JoinChannelView.tsx @@ -1,5 +1,6 @@ import { FC, useState, useEffect, useCallback } from 'react'; import { useTranslation } from 'react-i18next'; +import { useNavigate } from 'react-router-dom'; import { PrivacyLevel } from 'src/types'; import { Button } from 'src/components/common'; @@ -7,7 +8,6 @@ import { useNetworkClient } from 'src/contexts/network-client-context'; import { useUI } from 'src/contexts/ui-context'; import { useUtils } from 'src/contexts/utils-context'; import CheckboxToggle from 'src/components/common/CheckboxToggle'; -import { useRouter } from 'next/router'; import Input from 'src/components/common/Input'; import ModalTitle from '../ModalTitle'; import FormError from '@components/common/FormError'; @@ -18,7 +18,7 @@ const JoinChannelView: FC = () => { const [url, setUrl] = useState<string>(channelInviteLink || ''); const { getShareUrlType, joinChannel } = useNetworkClient(); - const router = useRouter(); + const navigate = useNavigate(); const { utils } = useUtils(); const [error, setError] = useState(''); const [needPassword, setNeedPassword] = useState(false); @@ -29,10 +29,10 @@ const JoinChannelView: FC = () => { return () => { if (channelInviteLink?.length) { setChannelInviteLink(''); - router.replace('/', undefined, { shallow: true }); + navigate('/', { replace: true }); } }; - }, [channelInviteLink?.length, router, setChannelInviteLink]); + }, [channelInviteLink?.length, navigate, setChannelInviteLink]); useEffect(() => { setError(''); @@ -72,7 +72,6 @@ const JoinChannelView: FC = () => { setPassword(''); closeModal(); } catch (e) { - // eslint-disable-next-line @typescript-eslint/no-explicit-any console.error((e as Error).message); setError(t('Something wrong happened, please check your details.')); } diff --git a/src/components/modals/LeaveChannelConfirmationView/LeaveChannelConfirmationView.module.scss b/src/components/modals/LeaveChannelConfirmationView/LeaveChannelConfirmationView.module.scss deleted file mode 100644 index dc85e48fdbdbe2a2ea2f0a89635890976c2fca32..0000000000000000000000000000000000000000 --- a/src/components/modals/LeaveChannelConfirmationView/LeaveChannelConfirmationView.module.scss +++ /dev/null @@ -1,16 +0,0 @@ -.root { - textarea { - border: none; - outline: none; - background-color: var(--dark-5); - - resize: none; - padding: 18px 14px; - color: var(--text-primary); - font-size: 14px; - width: 100%; - max-width: 520px; - height: 112px; - border-radius: 5px; - } -} diff --git a/src/components/modals/LeaveChannelConfirmationView/LeaveChannelConfirmationView.tsx b/src/components/modals/LeaveChannelConfirmationView/LeaveChannelConfirmationView.tsx index a9cf675ebef324c6d02159eed3e2ca1fc897bc95..ad2cfa84f1f883b399e6f44a29975f1ea3dffed8 100644 --- a/src/components/modals/LeaveChannelConfirmationView/LeaveChannelConfirmationView.tsx +++ b/src/components/modals/LeaveChannelConfirmationView/LeaveChannelConfirmationView.tsx @@ -1,13 +1,12 @@ import { FC, useCallback } from 'react'; import { useTranslation } from 'react-i18next'; - -import { Button } from 'src/components/common'; +import { useAppSelector } from 'src/store/hooks'; +import * as channels from 'src/store/channels'; import { useNetworkClient } from 'src/contexts/network-client-context'; import { useUI } from 'src/contexts/ui-context'; -import * as channels from 'src/store/channels'; -import { useAppSelector } from 'src/store/hooks'; +import { Button } from 'src/components/common'; import ModalTitle from '../ModalTitle'; -import Leave from '@components/icons/Leave'; +import Leave from 'src/components/icons/Leave'; const LeaveChannelConfirmationView: FC = () => { const { t } = useTranslation(); @@ -29,8 +28,10 @@ const LeaveChannelConfirmationView: FC = () => { return ( <> <ModalTitle className='mb-0'>{t('Leave Space')}</ModalTitle> - <h2>{currentChannel?.name}</h2> - <p className='text-charcoal-1'>{t('Are you sure you would like to leave this space?')}</p> + <h2 className='text-lg font-medium'>{currentChannel?.name}</h2> + <p className='text-charcoal-1 mb-6'> + {t('Are you sure you would like to leave this space?')} + </p> <Button className='w-full' onClick={onLeave}> {t('Yes, leave this space')} </Button> diff --git a/src/components/modals/LogoutView/LogoutView.module.scss b/src/components/modals/LogoutView/LogoutView.module.scss deleted file mode 100644 index f21b4d66156edc2373ab3a9b6f408070866acaa0..0000000000000000000000000000000000000000 --- a/src/components/modals/LogoutView/LogoutView.module.scss +++ /dev/null @@ -1,20 +0,0 @@ -.root { - & > input, - & > .error { - width: 100%; - max-width: 516px; - } - - .button { - color: black; - } - p { - font-weight: 500; - font-size: 12px; - line-height: 15px; - color: var(--cyan); - max-width: 520px; - text-align: left; - width: 100%; - } -} diff --git a/src/components/modals/LogoutView/LogoutView.tsx b/src/components/modals/LogoutView/LogoutView.tsx index b9bd15d9562aa7000fbed66f1b7b60ba859f260a..1372f36d5103cd54ab52e8bcc52ffd00d6ccfb5d 100644 --- a/src/components/modals/LogoutView/LogoutView.tsx +++ b/src/components/modals/LogoutView/LogoutView.tsx @@ -1,17 +1,14 @@ import { FC, useCallback, useState } from 'react'; import { useTranslation } from 'react-i18next'; -import { useRouter } from 'next/router'; - -import s from './LogoutView.module.scss'; -import cn from 'classnames'; +import { useNavigate } from 'react-router-dom'; import { Button } from 'src/components/common'; import { useNetworkClient } from 'src/contexts/network-client-context'; import { useUI } from 'src/contexts/ui-context'; import useInput from 'src/hooks/useInput'; -const LogoutView: FC = ({}) => { +const LogoutView: FC = () => { const { t } = useTranslation(); - const router = useRouter(); + const navigate = useNavigate(); const { logout } = useNetworkClient(); const { closeModal } = useUI(); const [error, setError] = useState(''); @@ -23,25 +20,30 @@ const LogoutView: FC = ({}) => { const result = logout(password); if (result) { closeModal(); - router.push('/'); + navigate('/'); } else { setError(t('Something wrong occured! Please check your details.')); } } - }, [t, closeModal, logout, password, router]); + }, [t, closeModal, logout, password, navigate]); return ( - <div className={cn('w-full flex flex-col justify-center items-center', s.root)}> + <div className='w-full flex flex-col justify-center items-center'> <h2 className='mt-9 mb-4'>{t('Logout')}</h2> - <p className='mb-8'> + <p className='mb-8 font-medium text-xs leading-tight text-cyan max-w-[520px] text-left w-full'> {t(`Warning: By logging out, all of you current data will be deleted from your browser. Please make sure you have a backup first. This can't be undone.`)} </p> <input type='password' - className='mt-3 mb-4' - name='' + className=' + mt-3 mb-4 w-full max-w-[516px] + border-none outline-none + bg-dark-5 px-2.5 py-[18px] + text-text-primary text-sm + rounded + ' onKeyDown={(e) => { if (e.key === 'Enter') { handleSubmit(); @@ -52,12 +54,8 @@ const LogoutView: FC = ({}) => { onChange={setPassword} /> - {error && ( - <div className={cn('text text--xs mt-2', s.error)} style={{ color: 'var(--red)' }}> - {error} - </div> - )} - <Button className={cn('mt-6 mb-10')} onClick={handleSubmit}> + {error && <div className='text-xs mt-2 text-red w-full max-w-[516px]'>{error}</div>} + <Button className='mt-6 mb-10 text-black' onClick={handleSubmit}> {t('Confirm')} </Button> </div> diff --git a/src/components/modals/Modal.module.scss b/src/components/modals/Modal.module.scss deleted file mode 100644 index 8963ac998d6d6ad96ad474de58ab14e5155a3495..0000000000000000000000000000000000000000 --- a/src/components/modals/Modal.module.scss +++ /dev/null @@ -1,41 +0,0 @@ -.root { - position: fixed; - top: 0; - left: 0; - bottom: 0; - right: 0; - backdrop-filter: blur(3px); - height: 100%; - -webkit-backdrop-filter: blur(3px); - display: flex; - align-items: center; - justify-content: center; -} - -.modal { - position: relative; - display: flex; - flex-direction: column; - align-items: center; - overflow-y: hidden; - -webkit-overflow-scrolling: touch; - background: var(--dark-1); - backdrop-filter: blur(100px); - padding: 0 72px; - min-height: 50px; - - min-width: 680px; - max-width: 680px; - border-radius: 10px; -} - -.modal:focus { - outline: none; -} - -.close { - position: absolute; - right: 20px; - top: 20px; - cursor: pointer; -} diff --git a/src/components/modals/Modal.tsx b/src/components/modals/Modal.tsx index 2f04fbff6fefebb4a0f36a28ac77f0436c18ad04..11e89631e5296974ca2ada3dff2fd03062768c3d 100644 --- a/src/components/modals/Modal.tsx +++ b/src/components/modals/Modal.tsx @@ -1,21 +1,17 @@ -import type { WithChildren } from '@types'; import { FC, HTMLProps, useRef } from 'react'; -import cn from 'classnames'; import { useTranslation } from 'react-i18next'; - -import s from './Modal.module.scss'; import Close from 'src/components/icons/X'; import { useOnClickOutside } from 'usehooks-ts'; import { Spinner } from '@components/common'; -type ModalProps = WithChildren & - HTMLProps<HTMLDivElement> & { - closeable?: boolean; - className?: string; - loading?: boolean; - onClose: () => void; - onEnter?: () => void | null; - }; +type ModalProps = { + children: React.ReactNode; + closeable?: boolean; + className?: string; + loading?: boolean; + onClose: () => void; + onEnter?: () => void | null; +} & HTMLProps<HTMLDivElement>; const Modal: FC<ModalProps> = ({ children, @@ -30,18 +26,27 @@ const Modal: FC<ModalProps> = ({ useOnClickOutside(ref, closeable ? onClose : () => {}); return ( - <div {...props} className={cn('z-20', s.root)}> + <div + {...props} + className='fixed inset-0 backdrop-blur-sm flex items-center justify-center z-20' + > <div - className={cn( - className, - 'drop-shadow-xl rounded-2xl bg-charcoal-4 w-[28rem] p-12 relative' - )} + className={` + drop-shadow-xl rounded-2xl bg-charcoal-4 + w-[28rem] p-12 relative + ${className} + `} role='dialog' ref={ref} > {closeable && ( <Close - className='w-9 h-9 p-2 absolute right-5 top-5 cursor-pointer hover:text-near-black rounded-full hover:bg-primary' + className=' + w-9 h-9 p-2 + absolute right-5 top-5 + cursor-pointer hover:text-near-black + rounded-full hover:bg-primary + ' onClick={onClose} aria-label={t('Close panel')} /> diff --git a/src/components/modals/Modal/index.tsx b/src/components/modals/Modal/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..c2e430c030d219b07520c0accbfbe3933dbcfe88 --- /dev/null +++ b/src/components/modals/Modal/index.tsx @@ -0,0 +1,59 @@ +import React, { FC, useCallback, useEffect } from 'react'; +import { createPortal } from 'react-dom'; +import { X } from 'src/components/icons'; +import { Spinner } from 'src/components/common'; + +type Props = { + children: React.ReactNode; + onClose?: () => void; + closeable?: boolean; + loading?: boolean; +}; + +const Modal: FC<Props> = ({ children, onClose, closeable = true, loading = false }) => { + const handleEscape = useCallback( + (e: KeyboardEvent) => { + if (e.key === 'Escape' && closeable && onClose) { + onClose(); + } + }, + [closeable, onClose] + ); + + useEffect(() => { + document.addEventListener('keydown', handleEscape); + return () => document.removeEventListener('keydown', handleEscape); + }, [handleEscape]); + + return createPortal( + <div + className=' + fixed inset-0 + backdrop-blur-[3px] -webkit-backdrop-blur-[3px] + flex items-center justify-center + ' + > + <div + className=' + relative flex flex-col items-center + overflow-y-hidden + bg-dark-1 backdrop-blur-[100px] + px-[72px] min-h-[50px] + min-w-[680px] max-w-[680px] + rounded-[10px] + focus:outline-none + ' + > + {closeable && onClose && ( + <button onClick={onClose} className='absolute right-5 top-5 cursor-pointer'> + <X /> + </button> + )} + {loading ? <Spinner /> : children} + </div> + </div>, + document.body + ); +}; + +export default Modal; diff --git a/src/components/modals/MuteUser/MuteUser.module.scss b/src/components/modals/MuteUser/MuteUser.module.scss deleted file mode 100644 index d6e36c660f559c1f06210a1f81505555787f6a33..0000000000000000000000000000000000000000 --- a/src/components/modals/MuteUser/MuteUser.module.scss +++ /dev/null @@ -1,11 +0,0 @@ -.buttonGroup { - margin-left: -0.5rem; - margin-right: -0.5rem; - display: flex; - flex-wrap: wrap; - justify-content: center; - - & > button { - margin: 0.5rem 0.75rem; - } -} diff --git a/src/components/modals/MuteUser/index.tsx b/src/components/modals/MuteUser/index.tsx index ce71bb8c70ebbbcc1c6d095fc0dd5ee612fa584e..6389f189b66ec67d84b4d9c826c5dbdc253e75e5 100644 --- a/src/components/modals/MuteUser/index.tsx +++ b/src/components/modals/MuteUser/index.tsx @@ -1,58 +1,42 @@ -import { FC, useCallback, useState } from 'react'; -import cn from 'classnames'; +import { FC, useCallback } from 'react'; import { useTranslation } from 'react-i18next'; - import { Button } from 'src/components/common'; -import Modal from 'src/components/modals'; - -import s from './MuteUser.module.scss'; - -export type MuteUserAction = 'mute' | 'mute+delete'; +import Modal from 'src/components/modals/Modal'; +import { MuteUserAction } from 'src/types'; +import ModalTitle from '../ModalTitle'; type Props = { - onConfirm: (action: 'mute' | 'mute+delete') => Promise<void>; + onConfirm: (action: MuteUserAction) => Promise<void>; onCancel: () => void; }; const MuteUserModal: FC<Props> = ({ onCancel, onConfirm }) => { const { t } = useTranslation(); - const [loading, setLoading] = useState(false); - const handleConfirmation = useCallback( - (action: MuteUserAction) => async () => { - setLoading(true); - await onConfirm(action).finally(() => { - setLoading(false); - }); - }, - [onConfirm] - ); + const handleMute = useCallback(async () => { + await onConfirm('mute'); + }, [onConfirm]); + + const handleMuteAndDelete = useCallback(async () => { + await onConfirm('mute+delete'); + }, [onConfirm]); return ( - <Modal loading={loading} onClose={onCancel}> - <div className={cn('w-full flex flex-col justify-center items-center')}> - <h2 className={cn('mt-9 mb-4')}>{t('Warning')}</h2> - <p className='mb-4'> - {t(` - Muting a user will revoke their ability to send messages. - They will, however, still be able to view messages. - `)} - </p> - <p className='mb-4' style={{ color: 'var(--red)', textTransform: 'uppercase' }}> - ** {t('Important to note that deleting messages cannot be undone.')} ** - </p> - <div className={cn('mb-6', s.buttonGroup)}> - <Button - style={{ backgroundColor: 'var(--red)', borderColor: 'var(--red)' }} - onClick={handleConfirmation('mute+delete')} - > - {t('Mute and delete the last message')} - </Button> - <Button onClick={handleConfirmation('mute')}>{t('Just Mute')}</Button> - <Button variant='secondary' onClick={onCancel}> - {t('Cancel')} - </Button> - </div> + <Modal onClose={onCancel}> + <ModalTitle>{t('Warning')}</ModalTitle> + <p className='mb-4 text-red uppercase text-center'> + ** {t('Important to note that muting users cannot be undone.')} ** + </p> + <div className='flex flex-wrap justify-center -mx-2'> + <Button variant='outlined' className='m-2' onClick={onCancel}> + {t('Cancel')} + </Button> + <Button className='m-2' onClick={handleMute}> + {t('Mute')} + </Button> + <Button className='m-2' onClick={handleMuteAndDelete}> + {t('Mute and Delete Messages')} + </Button> </div> </Modal> ); diff --git a/src/components/modals/NetworkNotReadyView/index.tsx b/src/components/modals/NetworkNotReadyView/index.tsx new file mode 100644 index 0000000000000000000000000000000000000000..60da78c62bdbb734236f7c5882892c52c39c97e1 --- /dev/null +++ b/src/components/modals/NetworkNotReadyView/index.tsx @@ -0,0 +1,25 @@ +import { FC } from 'react'; +import { useTranslation } from 'react-i18next'; +import { Button } from 'src/components/common'; +import { useUI } from 'src/contexts/ui-context'; +import ModalTitle from '../ModalTitle'; +import React from 'react'; + +const NetworkNotReadyView: FC = () => { + const { t } = useTranslation(); + const { closeModal } = useUI(); + + return ( + <> + <ModalTitle>{t('Network Not Ready')}</ModalTitle> + <p className='mb-6 text-sm text-center text-charcoal-1'> + {t('The network is not ready to send messages yet. Please try again in a few seconds.')} + </p> + <Button className='w-full' onClick={closeModal}> + {t('Ok')} + </Button> + </> + ); +}; + +export default NetworkNotReadyView; diff --git a/src/components/modals/NewDM/index.tsx b/src/components/modals/NewDM/index.tsx index 7e55c65e3354ad8a48b8e33af964e5207ed33f24..0881b7d6a1428b9d50305167695cf1defe4ed2fe 100644 --- a/src/components/modals/NewDM/index.tsx +++ b/src/components/modals/NewDM/index.tsx @@ -1,76 +1,68 @@ -import SearchInput from '@components/common/SearchInput'; -import ModalTitle from '../ModalTitle'; -import { useAppSelector } from 'src/store/hooks'; -import * as messages from 'src/store/messages'; -import Identity from '@components/common/Identity'; +import React, { FC, useCallback, useState } from 'react'; import { useTranslation } from 'react-i18next'; -import { Button } from '@components/common'; -import { useMemo } from 'react'; -import useInput from 'src/hooks/useInput'; +import { Button } from 'src/components/common'; +import { useUI } from 'src/contexts/ui-context'; import useDmClient from 'src/hooks/useDmClient'; +import ModalTitle from '../ModalTitle'; +import { useAppSelector } from 'src/store/hooks'; import { fullIdentity } from 'src/store/selectors'; -const NewDM = () => { +const NewDM: FC = () => { const { t } = useTranslation(); + const { closeModal } = useUI(); const { createConversation } = useDmClient(); - const contributors = useAppSelector(messages.selectors.messageableContributors); - const [search, setSearch] = useInput(''); + const [error, setError] = useState(''); + const [inviteLink, setInviteLink] = useState(''); const user = useAppSelector(fullIdentity); - const filteredContributors = useMemo(() => { - const s = search.toLocaleLowerCase(); - return contributors.filter( - (c) => - c.codename.toLocaleLowerCase().includes(s) || - c.nickname?.toLocaleLowerCase().includes(s) || - ('Note to self'.toLocaleLowerCase().includes(s) && c.pubkey === user?.pubkey) - ); - }, [contributors, search, user?.pubkey]); + const handleSubmit = useCallback(async () => { + if (!inviteLink || !user) return; - const userDmToken = useMemo( - () => filteredContributors.find((c) => c.pubkey === user?.pubkey)?.dmToken, - [filteredContributors, user?.pubkey] - ); + try { + const conversation = { + token: parseInt(inviteLink, 10), + pubkey: user.pubkey, + codename: user.codename, + nickname: user.nickname, + color: user.color || 'var(--charcoal-1)', + codeset: user.codeset + }; + + await createConversation(conversation); + closeModal(); + } catch (e) { + setError(t('Invalid invite link')); + } + }, [closeModal, createConversation, inviteLink, t, user]); return ( <> - <ModalTitle>{t('Send a Direct Message')}</ModalTitle> - - {contributors.length === 0 ? ( - <p className='text-red'>{t('Nobody from your channels is messageable.')}</p> - ) : ( - <SearchInput value={search} onChange={setSearch} className='w-full' /> - )} - - <div className='w-full space-y-2 max-h-80 overflow-y-auto'> - {user && userDmToken !== undefined && ( - <Button - onClick={() => createConversation({ ...user, token: userDmToken })} - className='block w-full text-left hover:bg-charcoal-3-20 rounded-lg px-4 py-1' - variant='unstyled' - > - <Identity {...user} /> {t('(Note to self)')} - </Button> - )} - {filteredContributors - .filter((c) => c.pubkey !== user?.pubkey) - .map((contributor) => ( - <Button - key={contributor.pubkey} - onClick={() => - createConversation({ - ...contributor, - token: contributor.dmToken ?? -1, - color: contributor.color ?? 'var(charcoal-1)' - }) - } - className='block w-full text-left hover:bg-charcoal-3-20 rounded-lg px-4 py-1' - variant='unstyled' - > - <Identity {...contributor} /> - </Button> - ))} - </div> + <ModalTitle>{t('Start Direct Message')}</ModalTitle> + <p className='mb-8 font-medium text-xs leading-tight text-cyan max-w-[520px] text-left w-full'> + {t('Enter an invite link to start a direct message conversation.')} + </p> + <input + type='text' + className=' + w-full max-w-[520px] + border-none outline-none + bg-dark-5 px-2.5 py-[18px] + text-text-primary text-sm + rounded mb-6 + ' + placeholder={t('Enter invite link')} + value={inviteLink} + onChange={(e) => setInviteLink(e.target.value)} + onKeyDown={(e) => { + if (e.key === 'Enter') { + handleSubmit(); + } + }} + /> + {error && <div className='text-xs mt-2 text-red w-full max-w-[520px]'>{error}</div>} + <Button className='mt-5 w-full max-w-[520px]' onClick={handleSubmit} disabled={!inviteLink}> + {t('Start Conversation')} + </Button> </> ); }; diff --git a/src/components/modals/NickNameSetView/NickNameSetView.module.scss b/src/components/modals/NickNameSetView/NickNameSetView.module.scss deleted file mode 100644 index e9fdf2837b687a27bbd82a1d09fc978fddae061a..0000000000000000000000000000000000000000 --- a/src/components/modals/NickNameSetView/NickNameSetView.module.scss +++ /dev/null @@ -1,10 +0,0 @@ -.root { - input:-webkit-autofill, - input:-webkit-autofill:hover, - input:-webkit-autofill:focus, - input:-webkit-autofill:active { - box-shadow: 0 0 0 30px var(--dark-5) inset; - -webkit-box-shadow: 0 0 0 30px var(--dark-5) inset; - -webkit-text-fill-color: var(--text-primary); - } -} diff --git a/src/components/modals/NickNameSetView/NickNameSetView.tsx b/src/components/modals/NickNameSetView/NickNameSetView.tsx index 8983d591989d355ebfbc6313294a066276459050..c80f97fbbf8f66135d2d39432054dbfbd8e38931 100644 --- a/src/components/modals/NickNameSetView/NickNameSetView.tsx +++ b/src/components/modals/NickNameSetView/NickNameSetView.tsx @@ -1,67 +1,58 @@ import { FC, useCallback, useState } from 'react'; import { useTranslation } from 'react-i18next'; - import { Button } from 'src/components/common'; import { useNetworkClient } from 'src/contexts/network-client-context'; import { useUI } from 'src/contexts/ui-context'; -import * as channels from 'src/store/channels'; -import * as dms from 'src/store/dms'; -import { useAppSelector } from 'src/store/hooks'; -import * as globalSelectors from 'src/store/selectors'; +import useInput from 'src/hooks/useInput'; import ModalTitle from '../ModalTitle'; -import Input from '@components/common/Input'; -import FormError from '@components/common/FormError'; const NickNameSetView: FC = () => { const { t } = useTranslation(); - const currentChannel = useAppSelector(channels.selectors.currentChannel); - const currentConversation = useAppSelector(dms.selectors.currentConversation); - const { setNickname: setNickName } = useNetworkClient(); - const nickname = useAppSelector(globalSelectors.currentNickname); - const [localNickname, setLocalNickname] = useState(nickname || ''); - const [error, setError] = useState(''); const { closeModal } = useUI(); + const { setNickname } = useNetworkClient(); + const [nickname, setNicknameValue] = useInput(''); + const [error, setError] = useState(''); - const onSubmit = useCallback(() => { - setError(''); - const success = setNickName(localNickname); - if (success) { - closeModal(); - } else { - setError(t('Invalid nickname')); + const handleSubmit = useCallback(async () => { + if (nickname.length) { + try { + setNickname(nickname); + closeModal(); + } catch (e) { + setError(t('Something wrong happened, please try again.')); + } } - }, [t, closeModal, localNickname, setNickName]); + }, [closeModal, nickname, setNickname, t]); return ( - <> + <div className='w-full flex flex-col justify-center items-center'> <ModalTitle>{t('Set Nickname')}</ModalTitle> - <p className='text-charcoal-1'> - {currentConversation - ? t('Set your nickname for the {{channelName}} channel', { - channelName: currentChannel?.name - }) - : t('Set your nickname for all direct messages')} + <p className='mb-8 font-medium text-xs leading-tight text-cyan max-w-[520px] text-left w-full'> + {t('Set a nickname to make yourself more recognizable to others.')} </p> - <Input + <input type='text' - placeholder={t('Enter your nickname')} - className='mt-1' - value={localNickname} + className=' + w-full max-w-[520px] + border-none outline-none + bg-dark-5 px-2.5 py-[18px] + text-text-primary text-sm + rounded mb-6 + ' + placeholder={t('Enter nickname')} + value={nickname} + onChange={setNicknameValue} onKeyDown={(e) => { if (e.key === 'Enter') { - e.preventDefault(); - onSubmit(); + handleSubmit(); } }} - onChange={(e) => { - setLocalNickname(e.target.value); - }} /> - {error && <FormError>{error}</FormError>} - <Button className='my-7' onClick={onSubmit}> - {t('Save')} + {error && <div className='text-xs mt-2 text-red w-full max-w-[520px]'>{error}</div>} + <Button className='mt-5 w-full max-w-[520px]' onClick={handleSubmit}> + {t('Set Nickname')} </Button> - </> + </div> ); }; diff --git a/src/components/modals/PinMessageModal/PinMessage.module.scss b/src/components/modals/PinMessageModal/PinMessage.module.scss deleted file mode 100644 index d6e36c660f559c1f06210a1f81505555787f6a33..0000000000000000000000000000000000000000 --- a/src/components/modals/PinMessageModal/PinMessage.module.scss +++ /dev/null @@ -1,11 +0,0 @@ -.buttonGroup { - margin-left: -0.5rem; - margin-right: -0.5rem; - display: flex; - flex-wrap: wrap; - justify-content: center; - - & > button { - margin: 0.5rem 0.75rem; - } -} diff --git a/src/components/modals/UpdatesModal.module.scss b/src/components/modals/UpdatesModal.module.scss deleted file mode 100644 index b76df75e275c1453b8356f5a3da5b9b92f0c2f68..0000000000000000000000000000000000000000 --- a/src/components/modals/UpdatesModal.module.scss +++ /dev/null @@ -1,22 +0,0 @@ -.root { - h2 { - margin-bottom: 2.5rem; - } - h3 { - margin-bottom: 1rem; - } - - ul { - text-indent: -1.4rem; - margin-left: 3rem; - margin-bottom: 2rem; - - li { - margin-bottom: 1rem; - } - } - - padding: 4rem; - max-height: 70vh; - overflow: auto; -} diff --git a/src/components/modals/UpdatesModal.tsx b/src/components/modals/UpdatesModal.tsx index 491cf8457ddc60537fba20d50281d230e2686740..1474fd204196d8f470406f03382f37e5f901de60 100644 --- a/src/components/modals/UpdatesModal.tsx +++ b/src/components/modals/UpdatesModal.tsx @@ -1,68 +1,65 @@ -import cn from 'classnames'; +import { useEffect, useState } from 'react'; +import { useTranslation } from 'react-i18next'; import { Button } from '@components/common'; import Modal from 'src/components/modals/Modal'; -import useLocalStorage from 'src/hooks/useLocalStorage'; +import { useUI } from 'src/contexts/ui-context'; -import s from './UpdatesModal.module.scss'; - -/* - <li className='text-center'> - 📣 New messages now separated by a divider so you know exactly which - of them are new to you. - </li> - <li className='text-center'> - ✉️ You can now easily create a new dm by clicking on the + button - next to Direct Messages on the left. - </li> - <li className='text-center'> - ⚠️ The text area now explicitly tells you when your message is too long. - It also now has a maximum height so you wont lose your send button when - trying to write your novel. - </li> - <li className='text-center'> - 🫡 Added a call to action to join the xxGeneralChat channel - by adding a prompt when a user hasn't joined any channels yet. - </li> - <li className='text-center'> - 🐛 Fixed an issue where going to a join link without being logged in - wouldn't ask you to join the channel after logging in. - </li> - <li className='text-center'> - 🧐 Dm channels now display your common channels where the description - would be. - </li> -*/ +const APP_VERSION = import.meta.env.APP_VERSION || 'Unknown'; const UpdatesModal = () => { - const [showModal, setShowModal] = useLocalStorage( - `update-notice_${process.env.NEXT_PUBLIC_APP_VERSION}`, - true - ); + const { t } = useTranslation(); + const [show, setShow] = useState(false); + + const closeModal = () => { + setShow(false); + }; - return showModal ? ( + useEffect(() => { + const lastVersion = localStorage.getItem('version'); + if (lastVersion !== APP_VERSION) { + setShow(true); + localStorage.setItem('version', APP_VERSION); + } + }, []); + + if (!show) return null; + + return ( <Modal data-testid='updates-modal' - className={cn(s.root, 'm-4 md:w-[42rem]')} - onClose={() => setShowModal(false)} + className=' + m-4 md:w-[42rem] + p-16 max-h-[70vh] overflow-auto + [&>h2]:mb-10 + [&>h3]:mb-4 + [&>ul]:indent-[-1.4rem] + [&>ul]:ml-12 + [&>ul]:mb-8 + [&>ul>li]:mb-4 + ' + onClose={closeModal} > - <h2 className='text-center'>Version {process.env.NEXT_PUBLIC_APP_VERSION}</h2> - <ul style={{ marginLeft: '-1rem' }}> - <li className='text-center'>⭐ Automatically join xxGeneralChat</li> + <h2 className='text-center'>{t('Updates')}</h2> + <p className='mb-8'> + {t('Haven has been updated to version')} {APP_VERSION} + </p> + <ul> + <li className='text-center'>🚀 Version 0.4.0 Released</li> <li className='text-center'> - 🔍 Haven links now have previews when you send them via social media - </li> - <li className='text-center'> - 👨🦳 Update to xxdk-wasm v0.3.22, which should improve time to initialize a new user - codename + ⚡ Migrated to Vite for faster development and better performance </li> + <li className='text-center'>🖥️ Added full support for Internet Computer Protocol (ICP)</li> + <li className='text-center'>📝 Fixed text formatting and editor issues</li> + <li className='text-center'>🔒 Improved password handling and browser integration</li> + <li className='text-center'>🏗️ Enhanced build system and code splitting</li> </ul> <div className='text-center'> - <Button data-testid='updates-modal-confirm' onClick={() => setShowModal(false)}> - Big ups! + <Button data-testid='updates-modal-confirm' onClick={closeModal}> + {t('Close')} </Button> </div> </Modal> - ) : null; + ); }; export default UpdatesModal; diff --git a/src/components/views/CodeNameRegistration/CodeNameRegistration.module.scss b/src/components/views/CodeNameRegistration/CodeNameRegistration.module.scss deleted file mode 100644 index e164698dc5af07dbf88b3ffe53288e6673d444b7..0000000000000000000000000000000000000000 --- a/src/components/views/CodeNameRegistration/CodeNameRegistration.module.scss +++ /dev/null @@ -1,59 +0,0 @@ -.root { - height: 100vh; - - .codeContainers, - .loading { - max-width: 85%; - padding: 4px; - flex: 1; - max-height: 500px; - } - - .codename { - cursor: pointer; - outline: none; - font-weight: 400; - padding: 12px 8px; - color: var(--text-primary); - border-radius: 5px; - word-break: break-all; - text-align: center; - display: flex; - align-items: center; - justify-content: center; - margin: 2px; - - &.selected { - background-color: var(--primary); - - .identity span { - color: var(--near-black) !important; - } - .identity svg { - fill: var(--near-black) !important; - } - } - - &:hover { - margin: 0; - border: 2px solid var(--primary); - } - } - - .generateButton { - margin-right: 20px; - font-weight: 700; - font-size: 14px; - &:disabled:hover { - cursor: not-allowed; - } - } - - .registerButton { - font-weight: 700; - font-size: 14px; - &:disabled:hover { - cursor: not-allowed; - } - } -} diff --git a/src/components/views/CodeNameRegistration/index.tsx b/src/components/views/CodeNameRegistration/index.tsx index 987f47a313817c727233267738a3de434ca2d63a..ef0749cabf2c59550aeb39dd932233bffbb2b061 100644 --- a/src/components/views/CodeNameRegistration/index.tsx +++ b/src/components/views/CodeNameRegistration/index.tsx @@ -6,7 +6,6 @@ import { Button, ImportCodeNameLoading } from 'src/components/common'; import { useNetworkClient } from 'src/contexts/network-client-context'; import { Spinner } from 'src/components/common'; -import s from './CodeNameRegistration.module.scss'; import Identity from 'src/components/common/Identity'; import { AMOUNT_OF_IDENTITIES_TO_GENERATE } from 'src/constants'; import { useAuthentication } from '@contexts/authentication-context'; @@ -17,7 +16,7 @@ type Props = { const CodenameRegistration: FC<Props> = ({ password }) => { const { t } = useTranslation(); - const { getOrInitPassword } = useAuthentication(); + const { getOrInitPassword, setIsAuthenticated } = useAuthentication(); const { checkRegistrationReadiness, cmix, generateIdentities } = useNetworkClient(); const [loading, setLoading] = useState(false); const [identities, setIdentites] = useState<ReturnType<typeof generateIdentities>>([]); @@ -46,34 +45,23 @@ const CodenameRegistration: FC<Props> = ({ password }) => { if (isReadyInfo.isReady) { setTimeout(() => { setLoading(false); - // Dont mess with this, it needs exactly 3 seconds - // for the database to initialize + setIsAuthenticated(true); }, 3000); } setReadyProgress(Math.ceil((isReadyInfo?.howClose || 0) * 100)); }); } }, 500); - }, [checkRegistrationReadiness, selectedPrivateIdentity]); + }, [checkRegistrationReadiness, selectedPrivateIdentity, setIsAuthenticated]); return loading ? ( <ImportCodeNameLoading fullscreen readyProgress={readyProgress} /> ) : ( - <div className={cn('w-full flex flex-col justify-center items-center px-6', s.root)}> + <div className='w-full flex flex-col justify-center items-center px-6'> <h2 data-testid='codename-registration-title' className='mt-9 mb-4'> {t('Find your Codename')} </h2> - <p - className='mb-8 text text--sm' - style={{ - color: 'var(--cyan)', - lineHeight: '18px', - fontSize: '14px', - fontWeight: '500', - maxWidth: '800px', - textAlign: 'center' - }} - > + <p className='mb-8 text-sm text-[var(--cyan)] leading-[18px] font-medium max-w-[800px] text-center'> <span> {t(` Codenames are generated on your computer by you. No servers or @@ -93,20 +81,14 @@ const CodenameRegistration: FC<Props> = ({ password }) => { {identities.length ? ( <div data-testid='codename-registration-options' - className={cn( - 'min-w-[85%] grid sm:grid-cols-2 lg:grid-cols-4 md:grid-cols-3 gap-x-4 gap-y-6 overflow-auto', - s.codeContainers - )} + className='min-w-[85%] grid sm:grid-cols-2 lg:grid-cols-4 md:grid-cols-3 gap-x-4 gap-y-6 overflow-auto' > {identities.map((i) => ( <div key={i.codename} className={cn( - 'overflow:auto rounded-xl bg-charcoal-4 md:overflow-hidden', - s.codename, - { - [s.selected]: i.codename === selectedCodeName - } + 'overflow-auto md:overflow-hidden rounded-xl bg-charcoal-4 cursor-pointer p-4', + i.codename === selectedCodeName ? 'ring-2 ring-cyan' : '' )} onClick={() => { setSelectedCodeName(i.codename); @@ -114,24 +96,22 @@ const CodenameRegistration: FC<Props> = ({ password }) => { }} > <span className='text-xs'> - <Identity className={s.identity} {...i} /> + <Identity {...i} /> </span> </div> ))} </div> ) : ( - <div className={s.loading}> - <div className='w-full h-full flex justify-center items-center'> - <Spinner size='lg' /> - </div> + <div className='w-full h-64 flex justify-center items-center'> + <Spinner size='lg' /> </div> )} - <div className='flex mb-5 mt-12'> + <div className='flex mb-5 mt-12 gap-4'> <Button variant='outlined' data-testid='discover-more-button' - className={s.generateButton} + className='disabled:opacity-50 disabled:cursor-not-allowed' onClick={() => { setSelectedCodeName(''); setIdentites(generateIdentities(AMOUNT_OF_IDENTITIES_TO_GENERATE)); @@ -144,6 +124,7 @@ const CodenameRegistration: FC<Props> = ({ password }) => { data-testid='claim-codename-button' onClick={register} disabled={!cmix || selectedCodeName.length === 0} + className='disabled:opacity-50 disabled:cursor-not-allowed' > {t('Claim')} </Button> diff --git a/src/components/views/JoinChannel/JoinChannel.module.scss b/src/components/views/JoinChannel/JoinChannel.module.scss deleted file mode 100644 index 53e1b477b70b913b3cfcfd0dd9e458a97a120359..0000000000000000000000000000000000000000 --- a/src/components/views/JoinChannel/JoinChannel.module.scss +++ /dev/null @@ -1,50 +0,0 @@ -.root { - & > div, - & > p, - .channelCredentials { - width: 100%; - max-width: 534px; - } - textarea { - border: none; - outline: none; - background-color: var(--dark-5); - - resize: none; - padding: 18px 14px; - color: var(--text-primary); - font-size: 11px; - line-height: 13px; - font-weight: 300; - width: 100%; - max-width: 520px; - border-radius: 5px; - margin-top: 8px; - } - .warn { - font-style: italic; - font-weight: 500; - font-size: 11px; - line-height: 13px; - } - .button { - color: black; - &:disabled:hover { - cursor: not-allowed; - } - } - - .channelCredentials { - background-color: var(--dark-5); - margin-top: 16px; - padding: 6px; - border-radius: 5px; - display: flex; - flex-direction: column; - align-items: stretch; - color: var(--text-secondary); - span { - word-break: break-all; - } - } -} diff --git a/src/components/views/JoinChannel/JoinChannel.tsx b/src/components/views/JoinChannel/JoinChannel.tsx index 05de905ad295a0f8e0c3531b0b145cb6974b1f71..c2d26011cb6ece24f155bd62edff2b00909e56db 100644 --- a/src/components/views/JoinChannel/JoinChannel.tsx +++ b/src/components/views/JoinChannel/JoinChannel.tsx @@ -1,13 +1,9 @@ import type { ChannelJSON } from 'src/types'; import { FC, useCallback, useState } from 'react'; import { useTranslation } from 'react-i18next'; -import cn from 'classnames'; - import { Button } from 'src/components/common'; -import { WarningComponent } from 'src/pages/_app'; - -import s from './JoinChannel.module.scss'; -import CheckboxToggle from '@components/common/CheckboxToggle'; +import WarningComponent from 'src/components/common/WarningComponent'; +import CheckboxToggle from 'src/components/common/CheckboxToggle'; type Props = { channelInfo: ChannelJSON; @@ -59,20 +55,20 @@ const JoinChannelView: FC<Props> = ({ } return ( - <div className={cn('w-full flex flex-col justify-center items-center', s.root)}> + <div className='w-full flex flex-col justify-center items-center p-4'> <h2 className='mt-9 mb-6'>{t('Join a Chat')}</h2> - <div> - <div className={cn('mb-4')}> + <div className='w-full max-w-[534px]'> + <div className='mb-4'> <h4>{channelInfo?.name || ''}</h4> - <p className={cn('mt-2 text text--xs')}>{channelInfo?.description || ''}</p> + <p className='mt-2 text-xs'>{channelInfo?.description || ''}</p> </div> - <div className={cn('text text--sm mb-2')}> + <div className='text-sm mb-2'> <span className='font-bold mr-1'>{t('Chat id')}:</span> <span>{channelInfo?.receptionId || ''}</span> </div> - <div className={cn(s.channelCredentials)}> - <span className='text--sm font-bold'>{t('Chat invite link')}:</span> - {<span className={cn('text text--xs')}>{url}</span>} + <div className='w-full max-w-[534px] bg-[var(--dark-5)] mt-4 p-1.5 rounded flex flex-col gap-2 text-[var(--text-secondary)]'> + <span className='text-sm font-bold'>{t('Chat invite link')}:</span> + <span className='text-xs break-all'>{url}</span> </div> </div> <div className='flex justify-between mt-8 w-full px-3'> @@ -80,10 +76,16 @@ const JoinChannelView: FC<Props> = ({ <CheckboxToggle checked={dmsEnabled} onChange={() => onDmsEnabledChange(!dmsEnabled)} /> </div> <div className='flex justify-center'> - <Button className={cn('mb-7 mt-16 mr-4', s.button)} onClick={handleConfirmation}> + <Button + className='mb-7 mt-16 mr-4 min-w-[120px] text-black disabled:cursor-not-allowed' + onClick={handleConfirmation} + > {t('Join')} </Button> - <Button className={cn('mb-7 mt-16', s.button)} onClick={handleCancelation}> + <Button + className='mb-7 mt-16 min-w-[120px] text-black disabled:cursor-not-allowed' + onClick={handleCancelation} + > {t('Cancel')} </Button> </div> diff --git a/src/components/views/Login/Login.module.scss b/src/components/views/Login/Login.module.scss deleted file mode 100644 index 9088abc607a8e92fb2396e1ef1c66727c28b1d00..0000000000000000000000000000000000000000 --- a/src/components/views/Login/Login.module.scss +++ /dev/null @@ -1,129 +0,0 @@ -.root { - height: 100vh; - width: 100%; - - display: flex; - flex-direction: column; - position: relative; - align-items: center; - overflow-y: auto; - - .wrapper { - justify-content: center; - align-items: center; - flex: 1; - } - - & > div { - max-width: 1440px; - } - - input:-webkit-autofill, - input:-webkit-autofill:hover, - input:-webkit-autofill:focus, - input:-webkit-autofill:active { - box-shadow: 0 0 0 30px var(--dark-5) inset; - -webkit-box-shadow: 0 0 0 30px var(--dark-5) inset; - -webkit-text-fill-color: var(--text-primary); - } - - .content { - width: 100%; - margin-bottom: 120px; - - h2 { - font-weight: 500; - } - } - .footer { - width: 100%; - } - .links { - margin-top: 32px; - padding-bottom: 6px; - display: flex; - justify-content: center; - - a { - font-family: 'Montserrat'; - font-style: normal; - white-space: nowrap; - - font-size: 12px; - line-height: 15px; - - color: #2e3137; - margin: 0 20px; - } - a:hover { - color: white; - } - } -} - -.perkCard:nth-of-type(1) { - background-color: rgba(255, 255, 255, 0.04); -} -.perkCard:nth-of-type(2) { - background-color: rgba(255, 255, 255, 0.03); -} -.perkCard:nth-of-type(3) { - background-color: rgba(255, 255, 255, 0.02); -} - -.perkCard { - padding: 36px 28px 28px 28px; - - &__title { - font-weight: 700; - font-size: 16px; - line-height: 20px; - margin-top: 22px; - margin-bottom: 8px; - - color: #ffffff; - } - &__description { - font-weight: 500; - font-size: 12px; - line-height: 15px; - - color: #5b5d62; - } -} - -.golden { - font-size: 48px; - color: #ecba60; - font-weight: 100; - line-height: 1.1; -} - -.thick { - font-size: 48px; - font-weight: 700; - line-height: 1.1; -} - -.highlighted { - background-color: var(--cyan); - padding: 8px; - margin-left: 12px; - font-weight: 700; - font-size: 18px; -} - -.normal { - font-size: 18px; - margin-top: 18px; -} - -.button { - border-radius: 8px; - font-weight: 700; - font-size: 14px; -} - -.loading { - text-align: center; -} diff --git a/src/components/views/Login/Login.tsx b/src/components/views/Login/Login.tsx index a84e57cb83f3bec7feb5208168ba64d8f7257869..9bc1f3a512240d3bc1778aa3f4f4789038ede248 100644 --- a/src/components/views/Login/Login.tsx +++ b/src/components/views/Login/Login.tsx @@ -1,11 +1,6 @@ import { FC, useCallback, useEffect, useState } from 'react'; -import cn from 'classnames'; import { useTranslation, Trans } from 'react-i18next'; - import { Button, Spinner } from 'src/components/common'; - -import s from './Login.module.scss'; - import { NormalHaven, OpenSource, NormalHash } from 'src/components/icons'; import { useAuthentication } from '@contexts/authentication-context'; import useAccountSync, { AccountSyncService, AccountSyncStatus } from 'src/hooks/useAccountSync'; @@ -31,141 +26,144 @@ const LoginView: FC = () => { }; bus.addListener(AppEvents.NEW_SYNC_CMIX_FAILED, listener); - return () => { bus.removeListener(AppEvents.NEW_SYNC_CMIX_FAILED, listener); }; }, [t]); - const handleSubmit = useCallback(async () => { - setError(''); - setIsLoading(true); - setTimeout(async () => { - try { - const success = await getOrInitPassword(password); - if (success) { - setIsAuthenticated(true); - } else { - setError(t('Something went wrong, please check your credentials.')); + const handleSubmit = useCallback( + async (e?: React.FormEvent) => { + if (e) e.preventDefault(); + setError(''); + setIsLoading(true); + setTimeout(async () => { + try { + const success = await getOrInitPassword(password); + if (success) { + setIsAuthenticated(true); + } else { + setError(t('Something went wrong, please check your credentials.')); + } + setIsLoading(false); + } catch (e) { + setError((e as Error).message); + setIsLoading(false); } - setIsLoading(false); - } catch (e) { - setError((e as Error).message); - setIsLoading(false); - } - }, 1); - }, [getOrInitPassword, password, setIsAuthenticated, t]); + }, 1); + }, + [getOrInitPassword, password, setIsAuthenticated, t] + ); return ( - <div className={cn('px-12 md:px-[3.75rem]', s.root)}> - <div className={cn('w-full flex flex-col', s.wrapper)}> - <div className={'my-16 w-full md:mt-16 md:mb-[6.5rem]'}> + <div className='h-screen w-full flex flex-col relative items-center overflow-y-auto px-12 md:px-[3.75rem]'> + <div className='w-full flex flex-col justify-center items-center max-w-[1440px] flex-1'> + <div className='my-16 w-full md:mt-16 md:mb-[6.5rem]'> <NormalHaven data-testid='haven-logo' /> </div> - <div className={cn('grid grid-cols-1 gap-0 md:grid-cols-12', s.content)}> + <div className='w-full mb-[120px] grid grid-cols-1 gap-0 md:grid-cols-12'> <div className='col-span-9 flex flex-col items-start'> <Trans> - <span className={cn(s.golden)}>True Freedom</span> - <span className={cn(s.thick)}>to express yourself,</span> - <span className={cn(s.golden)}>your thoughts, your beliefs.</span> - <span className={cn(s.normal)}> + <span className='text-[48px] text-[#ecba60] font-thin leading-[1.1]'> + True Freedom + </span> + <span className='text-[48px] font-bold leading-[1.1]'>to express yourself,</span> + <span className='text-[48px] text-[#ecba60] font-thin leading-[1.1]'> + your thoughts, your beliefs. + </span> + <span className='text-[18px] mt-[18px]'> Speak easily to a group of friends or a global community.{' '} - <span className={cn(s.highlighted)}>Talk about what you want.</span> + <span className='bg-cyan p-2 ml-3 font-bold text-[18px]'> + Talk about what you want. + </span> </span> </Trans> <Trans> - <span className={cn(s.normal)}> + <span className='text-[18px] mt-[18px]'> Surveillance free. Censorship proof. - <span className={cn(s.highlighted)}>Your Haven chats are yours.</span> + <span className='bg-cyan p-2 ml-3 font-bold text-[18px]'> + Your Haven chats are yours. + </span> </span> </Trans> </div> <div className='order-first mb-16 md:col-span-3 md:pl-3 md:order-none'> - <h2 className='mb-2'>{t('Login')}</h2> - <p className='mb-8 text' style={{ color: '#5B5D62', lineHeight: '17px' }}> + <h2 className='mb-2 font-medium'>{t('Login')}</h2> + <p className='mb-8 text-[#5B5D62] leading-[17px]'> {t('Use your password to unlock your Haven identity')} </p> - <Input - data-testid='password-input' - type='password' - placeholder={t('Enter your password')} - value={password} - onChange={(e) => { - setPassword(e.target.value); - }} - onKeyDown={(e) => { - if (e.key === 'Enter') { - if (accountSyncStatus !== AccountSyncStatus.Synced) { - e.preventDefault(); - handleSubmit(); - } - - if ( - accountSyncStatus === AccountSyncStatus.Synced && - accountSyncService === AccountSyncService.Dropbox - ) { - const dropboxButton = document.getElementById('dropbox-button'); - dropboxButton?.click(); - } - - if ( - accountSyncStatus === AccountSyncStatus.Synced && - accountSyncService === AccountSyncService.Google - ) { - const googleButton = document.getElementById('google-auth-button'); - googleButton?.click(); + <form onSubmit={handleSubmit} className='w-full'> + <input + type='text' + autoComplete='username' + style={{ display: 'none' }} + aria-hidden='true' + /> + <Input + data-testid='password-input' + type='password' + placeholder={t('Enter your password')} + value={password} + autoComplete='current-password' + onChange={(e) => { + setPassword(e.target.value); + }} + onKeyDown={(e) => { + if (e.key === 'Enter') { + if (accountSyncStatus !== AccountSyncStatus.Synced) { + e.preventDefault(); + handleSubmit(); + } } - } - }} - /> - <div className='flex flex-col mt-4 space-y-3'> - {accountSyncStatus !== AccountSyncStatus.Synced && ( - <Button data-testid='login-button' disabled={isLoading} onClick={handleSubmit}> - {t('Login')} - </Button> - )} - {attemptingSyncedLogin && ( - <Button variant='secondary' onClick={cancelSyncLogin}> - Cancel - </Button> - )} - </div> - {isLoading && ( - <div className={s.loading}> - {loadingInfo && <p className='mt-4'>{loadingInfo}</p>} - <Spinner /> - </div> - )} - - {error && ( - <div - data-testid='login-error' - style={{ - color: 'var(--red)', - marginTop: '14px', - fontSize: '11px', - - textAlign: 'center', - border: 'solid 1px #E3304B', - backgroundColor: 'rgba(227, 48, 75, 0.1)', - padding: '16px' }} - > - {error} + className='[&_input:-webkit-autofill]:shadow-[0_0_0_30px_var(--dark-5)_inset] [&_input:-webkit-autofill]:-webkit-text-fill-color-[var(--text-primary)]' + /> + <div className='flex flex-col mt-4 space-y-3'> + {accountSyncStatus !== AccountSyncStatus.Synced && ( + <Button + type='submit' + data-testid='login-button' + disabled={isLoading} + className='rounded-lg font-bold text-sm' + > + {t('Login')} + </Button> + )} + {attemptingSyncedLogin && ( + <Button variant='secondary' onClick={cancelSyncLogin}> + Cancel + </Button> + )} </div> - )} + {isLoading && ( + <div className='text-center'> + {loadingInfo && <p className='mt-4'>{loadingInfo}</p>} + <Spinner /> + </div> + )} + + {error && ( + <div + data-testid='login-error' + className='mt-[14px] text-[11px] text-center border border-red bg-red/10 p-4' + > + {error} + </div> + )} + </form> </div> </div> - <div className={cn('grid grid-cols-12 gap-0', s.footer)}> + <div className='w-full grid grid-cols-12 gap-0'> <a href='https://git.xx.network/elixxir/speakeasy-web' target='_blank' rel='noreferrer' - className={cn('flex flex-col col-span-6 md:col-span-4', s.perkCard)} + className='flex flex-col col-span-6 md:col-span-4 p-[36px_28px_28px_28px] bg-white/[0.04]' > <OpenSource /> - <span className={cn(s.perkCard__title)}>{t('Open Source')}</span> - <span className={cn(s.perkCard__description)}> + <span className='font-bold text-base leading-5 mt-[22px] mb-2 text-white'> + {t('Open Source')} + </span> + <span className='font-medium text-xs leading-[15px] text-[#5b5d62]'> {t('Every line — open source. Forever.')} </span> </a> @@ -173,32 +171,57 @@ const LoginView: FC = () => { href='https://learn.xx.network/' target='_blank' rel='noreferrer' - className={cn('flex flex-col col-span-6 md:col-span-4', s.perkCard)} + className='flex flex-col col-span-6 md:col-span-4 p-[36px_28px_28px_28px] bg-white/[0.03]' > <NormalHash /> - <span className={cn(s.perkCard__title)}>{t('Fundamentally Different')}</span> - <span className={cn(s.perkCard__description)}> + <span className='font-bold text-base leading-5 mt-[22px] mb-2 text-white'> + {t('Fundamentally Different')} + </span> + <span className='font-medium text-xs leading-[15px] text-[#5b5d62]'> {t('Powered by the first decentralized mixnet-blockchain')} </span> </a> </div> </div> - <div className={cn(s.links, 'flex-wrap gap-y-3 xs:flex-row')}> - <a href='https://xx.network/' target='_blank' rel='noreferrer'> + <div className='w-full mt-8 pb-[6px] flex justify-center flex-wrap gap-y-3 xs:flex-row'> + <a + href='https://xx.network/' + target='_blank' + rel='noreferrer' + className="font-['Montserrat'] text-xs leading-[15px] text-[#2e3137] mx-5 whitespace-nowrap hover:text-white" + > {t('xx network')} </a> - <a href='https://xx.network/privacy-policy/' target='_blank' rel='noreferrer'> + <a + href='https://xx.network/privacy-policy/' + target='_blank' + rel='noreferrer' + className="font-['Montserrat'] text-xs leading-[15px] text-[#2e3137] mx-5 whitespace-nowrap hover:text-white" + > {t('Privacy Policy')} </a> - - <a href='https://xx.network/terms-of-use/' target='_blank' rel='noreferrer'> + <a + href='https://xx.network/terms-of-use/' + target='_blank' + rel='noreferrer' + className="font-['Montserrat'] text-xs leading-[15px] text-[#2e3137] mx-5 whitespace-nowrap hover:text-white" + > {t('Terms of Use')} </a> - - <a href='https://xxfoundation.org/' target='_blank' rel='noreferrer'> + <a + href='https://xxfoundation.org/' + target='_blank' + rel='noreferrer' + className="font-['Montserrat'] text-xs leading-[15px] text-[#2e3137] mx-5 whitespace-nowrap hover:text-white" + > {t('xx foundation')} </a> - <a href='https://x.com/xx_network' target='_blank' rel='noreferrer'> + <a + href='https://x.com/xx_network' + target='_blank' + rel='noreferrer' + className="font-['Montserrat'] text-xs leading-[15px] text-[#2e3137] mx-5 whitespace-nowrap hover:text-white" + > Twitter </a> </div> diff --git a/src/components/views/Registration/Registration.module.scss b/src/components/views/Registration/Registration.module.scss deleted file mode 100644 index 168bad2e5903927369fee85b11df5abc15833383..0000000000000000000000000000000000000000 --- a/src/components/views/Registration/Registration.module.scss +++ /dev/null @@ -1,123 +0,0 @@ -.root { - height: 100vh; - width: 100%; - display: flex; - flex-direction: column; - - padding: 0 60px 0px 60px; - position: relative; - align-items: center; - overflow-y: auto; - - .wrapper { - justify-content: center; - align-items: center; - flex: 1; - } - - & > div { - max-width: 1440px; - } - - .header { - margin-top: 64px; - margin-bottom: 104px; - width: 100%; - } - .content { - width: 100%; - margin-bottom: 120px; - - h2 { - font-weight: 500; - } - } - .footer { - width: 100%; - } - .links { - margin-top: 32px; - padding-bottom: 6px; - display: flex; - justify-content: center; - - a { - font-family: 'Montserrat'; - font-style: normal; - white-space: nowrap; - - font-size: 12px; - line-height: 15px; - - color: #2e3137; - margin: 0 20px; - } - a:hover { - color: white; - } - } -} - -.perkCard:nth-of-type(1) { - background-color: rgba(255, 255, 255, 0.04); -} -.perkCard:nth-of-type(2) { - background-color: rgba(255, 255, 255, 0.03); -} -.perkCard:nth-of-type(3) { - background-color: rgba(255, 255, 255, 0.02); -} - -.perkCard { - padding: 36px 28px 28px 28px; - - &__title { - font-weight: 700; - font-size: 16px; - line-height: 20px; - margin-top: 22px; - margin-bottom: 8px; - - color: #ffffff; - } - &__description { - font-weight: 500; - font-size: 12px; - line-height: 15px; - - color: #5b5d62; - } -} - -.golden { - font-size: 48px; - color: #ecba60; - font-weight: 100; - line-height: 1.1; -} - -.thick { - font-size: 48px; - font-weight: 700; - line-height: 1.1; -} - -.highlighted { - background-color: var(--secondary); - padding: 8px; - margin-left: 12px; - font-weight: 700; - font-size: 18px; -} - -.normal { - font-size: 18px; - margin-top: 18px; -} - -.loading { - display: flex; - justify-content: center; - align-items: center; - transform: scale(0.4); -} diff --git a/src/components/views/Registration/index.tsx b/src/components/views/Registration/index.tsx index f7beb1514b41a8e5d310bbd70a4a1c692cdbf2b6..5bd0e00b5e0a6acd9b9dc6a7235d30cb656aad90 100644 --- a/src/components/views/Registration/index.tsx +++ b/src/components/views/Registration/index.tsx @@ -1,13 +1,8 @@ import { FC, useCallback, useState } from 'react'; import { useTranslation, Trans } from 'react-i18next'; -import cn from 'classnames'; - import { Button, Spinner } from 'src/components/common'; - import { NormalHaven, OpenSource, NormalHash } from 'src/components/icons'; import { useUI } from 'src/contexts/ui-context'; - -import s from './Registration.module.scss'; import Input from '@components/common/Input'; type Props = { @@ -23,58 +18,76 @@ const RegisterView: FC<Props> = ({ onPasswordConfirmation }) => { const [isLoading, setIsLoading] = useState(false); const [showSelectServiceMenu] = useState(false); - const onContinue = useCallback(() => { - if (passwordConfirm !== password) { - setError(t("Password doesn't match confirmation.")); - } else { - if (password.length) { - onPasswordConfirmation(password); - setIsLoading(false); + const onSubmit = useCallback( + (e: React.FormEvent) => { + e.preventDefault(); + if (passwordConfirm !== password) { + setError(t("Password doesn't match confirmation.")); + } else { + if (password.length) { + onPasswordConfirmation(password); + setIsLoading(false); + } + setError(''); } - setError(''); - } - }, [passwordConfirm, password, t, onPasswordConfirmation]); + }, + [passwordConfirm, password, t, onPasswordConfirmation] + ); return ( - <div className={cn('', s.root)}> - <div className={cn('w-full flex flex-col', s.wrapper)}> - <div className={cn(s.header)}> + <div className='h-screen w-full flex flex-col relative items-center overflow-y-auto px-[60px]'> + <div className='w-full flex flex-col justify-center items-center max-w-[1440px] flex-1'> + <div className='mt-16 mb-[104px] w-full'> <NormalHaven data-testid='speakeasy-logo' /> </div> - <div className={cn('grid grid-cols-1 gap-0 md:grid-cols-12', s.content)}> + <div className='w-full mb-[120px] grid grid-cols-1 gap-0 md:grid-cols-12'> <div className='col-span-9 flex flex-col items-start'> <Trans> - <span className={cn(s.golden)}>True Freedom</span> - <span className={cn(s.thick)}>to express yourself,</span> - <span className={cn(s.golden)}>your thoughts, your beliefs.</span> - <span className={cn(s.normal)}> + <span className='text-[48px] text-[#ecba60] font-thin leading-[1.1]'> + True Freedom + </span> + <span className='text-[48px] font-bold leading-[1.1]'>to express yourself,</span> + <span className='text-[48px] text-[#ecba60] font-thin leading-[1.1]'> + your thoughts, your beliefs. + </span> + <span className='text-[18px] mt-[18px]'> Speak easily to a group of friends or a global community.{' '} - <span className={cn(s.highlighted)}>Talk about what you want.</span> + <span className='bg-secondary p-2 ml-3 font-bold text-[18px]'> + Talk about what you want. + </span> </span> </Trans> <Trans> - <span className={cn(s.normal)}> + <span className='text-[18px] mt-[18px]'> Surveillance free. Censorship proof. - <span className={cn(s.highlighted)}>Your Haven chats are yours.</span> + <span className='bg-secondary p-2 ml-3 font-bold text-[18px]'> + Your Haven chats are yours. + </span> </span> </Trans> </div> <div className='order-first mb-16 md:col-span-3 md:pl-3 md:order-none'> - <h2 className='mb-2'>{t('Join the alpha')}</h2> + <h2 className='mb-2 font-medium'>{t('Join the alpha')}</h2> {!showSelectServiceMenu && ( - <> - <p className='mb-8 text' style={{ color: '#5B5D62', lineHeight: '17px' }}> + <form onSubmit={onSubmit}> + <input + type='text' + autoComplete='username' + style={{ display: 'none' }} + aria-hidden='true' + /> + <p className='mb-8 text-[#5B5D62] leading-[17px]'> {t('Enter a password to secure your sovereign Haven identity')} </p> <Input data-testid='registration-password-input' type='password' placeholder={t('Enter your password')} - className='' value={password} + autoComplete='new-password' onKeyDown={(e) => { if (e.key === 'Enter') { - onContinue(); + onSubmit(e); } }} onChange={(e) => { @@ -86,40 +99,33 @@ const RegisterView: FC<Props> = ({ onPasswordConfirmation }) => { data-testid='registration-password-confirmation' type='password' placeholder={t('Confirm your password')} + value={passwordConfirm} + autoComplete='new-password' className='mt-4' onKeyDown={(e) => { if (e.key === 'Enter') { - onContinue(); + onSubmit(e); } }} - value={passwordConfirm} onChange={(e) => { setPasswordConfirm(e.target.value); }} /> {isLoading && ( - <div className={s.loading}> + <div className='flex justify-center items-center scale-40'> <Spinner /> </div> )} {error && ( - <div - data-testid='registration-error' - className={'text text--xs mt-4'} - style={{ color: 'var(--red)' }} - > + <div data-testid='registration-error' className='text-xs mt-4 text-red'> {error} </div> )} <div className='flex flex-col mt-4'> - <Button - data-testid='registration-button' - disabled={isLoading} - onClick={onContinue} - > + <Button type='submit' data-testid='registration-button' disabled={isLoading}> {t('Continue')} </Button> </div> @@ -127,14 +133,7 @@ const RegisterView: FC<Props> = ({ onPasswordConfirmation }) => { {t('Already have an account?')} <Trans t={t}> <span - style={{ - textDecoration: 'underline', - fontSize: '16px', - fontWeight: '500', - textAlign: 'center', - marginTop: '12px', - cursor: 'pointer' - }} + className='underline text-base font-medium text-center mt-3 cursor-pointer' onClick={() => { setModalView('IMPORT_CODENAME'); openModal(); @@ -142,64 +141,25 @@ const RegisterView: FC<Props> = ({ onPasswordConfirmation }) => { > {t('Import')} </span>{' '} - an existing account{' '} - {/* or <span - style={{ - textDecoration: 'underline', - fontSize: '16px', - fontWeight: '500', - textAlign: 'center', - marginTop: '12px', - cursor: 'pointer' - }} - onClick={() => { - setShowSelectServiceMenu(true); - }} - > - {t('login')} - </span> from a cloud provider. */} + an existing account </Trans> </div> - </> - )} - {/* {showSelectServiceMenu && ( - <> - <p - className='mb-8 text' - style={{ color: '#5B5D62', lineHeight: '17px' }} - > - {t('Select your cloud provider')} - </p> - <div className='flex flex-col space-y-3'> - <Button onClick={() => { - setSyncLoginService(AccountSyncService.Google); - }}> - Google Drive <FontAwesomeIcon icon={faGoogleDrive} /> - </Button> - <Button onClick={() => { - setSyncLoginService(AccountSyncService.Dropbox); - }}> - Dropbox <FontAwesomeIcon icon={faDropbox} /> - </Button> - <Button variant='secondary' onClick={() => { setShowSelectServiceMenu(false); }}> - Cancel - </Button> - </div> - </> + </form> )} - */}{' '} </div> </div> - <div className={cn('grid grid-cols-12 gap-0', s.footer)}> + <div className='w-full grid grid-cols-12 gap-0'> <a href='https://git.xx.network/elixxir/speakeasy-web' target='_blank' rel='noreferrer' - className={cn('flex flex-col col-span-6 md:col-span-4', s.perkCard)} + className='flex flex-col col-span-6 md:col-span-4 p-[36px_28px_28px_28px] bg-white/[0.04]' > <OpenSource /> - <span className={cn(s.perkCard__title)}>{t('Open Source')}</span> - <span className={cn(s.perkCard__description)}> + <span className='font-bold text-base leading-5 mt-[22px] mb-2 text-white'> + {t('Open Source')} + </span> + <span className='font-medium text-xs leading-[15px] text-[#5b5d62]'> {t('Every line — open source. Forever.')} </span> </a> @@ -207,47 +167,57 @@ const RegisterView: FC<Props> = ({ onPasswordConfirmation }) => { href='https://learn.xx.network/' target='_blank' rel='noreferrer' - className={cn('flex flex-col col-span-6 md:col-span-4', s.perkCard)} + className='flex flex-col col-span-6 md:col-span-4 p-[36px_28px_28px_28px] bg-white/[0.03]' > <NormalHash /> - <span className={cn(s.perkCard__title)}>{t('Fundamentally Different')}</span> - <span className={cn(s.perkCard__description)}> - {t('Powered by the first decentralized mixnet-blockchain')} + <span className='font-bold text-base leading-5 mt-[22px] mb-2 text-white'> + {t('Fundamentally Different')} </span> - </a> - {/* <a - href='https://www.speakeasy.tech/roadmap/' - target='_blank' - rel='noreferrer' - className={cn('flex flex-col col-span-4', s.perkCard)} - > - <RoadMap /> - <span className={cn(s.perkCard__title)}> - {t('Roadmap')} - </span> - <span className={cn(s.perkCard__description)}> - {t('Building to the future')} + <span className='font-medium text-xs leading-[15px] text-[#5b5d62]'> + {t('Powered by the first decentralized mixnet-blockchain')} </span> </a> - */}{' '} </div> </div> - <div className={cn(s.links, 'flex-wrap gap-y-3 xs:flex-row')}> - <a href='https://xx.network/' target='_blank' rel='noreferrer'> + <div className='w-full mt-8 pb-[6px] flex justify-center flex-wrap gap-y-3 xs:flex-row'> + <a + href='https://xx.network/' + target='_blank' + rel='noreferrer' + className="font-['Montserrat'] text-xs leading-[15px] text-[#2e3137] mx-5 whitespace-nowrap hover:text-white" + > {t('xx network')} </a> - <a href='https://xx.network/privacy-policy/' target='_blank' rel='noreferrer'> + <a + href='https://xx.network/privacy-policy/' + target='_blank' + rel='noreferrer' + className="font-['Montserrat'] text-xs leading-[15px] text-[#2e3137] mx-5 whitespace-nowrap hover:text-white" + > {t('Privacy Policy')} </a> - - <a href='https://xx.network/terms-of-use/' target='_blank' rel='noreferrer'> + <a + href='https://xx.network/terms-of-use/' + target='_blank' + rel='noreferrer' + className="font-['Montserrat'] text-xs leading-[15px] text-[#2e3137] mx-5 whitespace-nowrap hover:text-white" + > {t('Terms of Use')} </a> - - <a href='https://xxfoundation.org/' target='_blank' rel='noreferrer'> + <a + href='https://xxfoundation.org/' + target='_blank' + rel='noreferrer' + className="font-['Montserrat'] text-xs leading-[15px] text-[#2e3137] mx-5 whitespace-nowrap hover:text-white" + > {t('xx foundation')} </a> - <a href='https://x.com/xx_network' target='_blank' rel='noreferrer'> + <a + href='https://x.com/xx_network' + target='_blank' + rel='noreferrer' + className="font-['Montserrat'] text-xs leading-[15px] text-[#2e3137] mx-5 whitespace-nowrap hover:text-white" + > X </a> </div> diff --git a/src/components/views/SettingsViews/AccountSync.tsx b/src/components/views/SettingsViews/AccountSync.tsx deleted file mode 100644 index def53c47d99051cbb4f81862bc5eb62b7cf864d4..0000000000000000000000000000000000000000 --- a/src/components/views/SettingsViews/AccountSync.tsx +++ /dev/null @@ -1,73 +0,0 @@ -import { useState } from 'react'; -import { Trans, useTranslation } from 'react-i18next'; - -import { Spinner } from '@components/common'; -import { useUI } from '@contexts/ui-context'; -import useAccountSync, { AccountSyncService } from 'src/hooks/useAccountSync'; -import Badge from '@components/common/Badge'; -import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; -import { faDropbox, faGoogleDrive } from '@fortawesome/free-brands-svg-icons'; - -const AccountSync = () => { - const { t } = useTranslation(); - useUI(); - const [loading] = useState(false); - const { isSynced, service } = useAccountSync(); - - return ( - <> - <h2>{t('Account Sync')}</h2> - <hr className='w-full my-10 border-charcoal-3' /> - <div className='space-y-10'> - <p> - {t(` - Sync your account with multiple devices using the cloud with account sync. - All files stored are encrypted so there are no privacy concerns with using these - third party services. - `)} - </p> - <div className='flex justify-between items-center'> - <h3 className='headline--sm'>{t('Status')}</h3> - <Badge color='gold' className='text-[0.875rem] p-2 tracking-normal rounded-lg'> - {isSynced ? t('Synced') : t('Not synced')} - </Badge> - </div> - {isSynced && ( - <div className='flex justify-between items-center'> - <h3 className='headline--sm'>{t('Service')}</h3> - <Badge - color='gold' - className='text-[0.875rem] p-2 flex space-x-2 tracking-normal rounded-lg' - > - {service === AccountSyncService.Google && ( - <> - <FontAwesomeIcon className='w-5 h-5' icon={faGoogleDrive} /> - <span>Google Drive</span> - </> - )} - {service === AccountSyncService.Dropbox && ( - <> - <FontAwesomeIcon className='w-5 h-5' icon={faDropbox} /> - <span>Dropbox</span> - </> - )} - </Badge> - </div> - )} - {!isSynced && ( - <> - <p style={{ color: 'var(--orange)' }}> - <Trans t={t}> - <strong>Warning!</strong> Once you choose a cloud provider you will not be able to - change to another service or revert to local-only. - </Trans> - </p> - {loading ? <Spinner size='md' /> : <strong>unsupported feature</strong>} - </> - )} - </div> - </> - ); -}; - -export default AccountSync; diff --git a/src/components/views/SettingsViews/DeveloperOptions.tsx b/src/components/views/SettingsViews/DeveloperOptions.tsx index 3e6482524e0303abeae73ac8a1e6ca34e18c9678..17d15419376264a366ba1e63ee6cdda39eb31756 100644 --- a/src/components/views/SettingsViews/DeveloperOptions.tsx +++ b/src/components/views/SettingsViews/DeveloperOptions.tsx @@ -1,11 +1,10 @@ import { useCallback, useEffect, useState } from 'react'; import { useTranslation } from 'react-i18next'; -import { faRadiation } from '@fortawesome/free-solid-svg-icons'; +import { Radiation } from 'lucide-react'; import { Button, Spinner } from '@components/common'; import { Download } from '@components/icons'; import SoundSelector from '@components/common/NotificationSoundSelector'; -import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { useRemoteStore } from '@contexts/remote-kv-context'; import useAccountSync from 'src/hooks/useAccountSync'; import { decoder } from '@utils/index'; @@ -94,9 +93,9 @@ const DeveloperOptionsView = () => { className='flex items-center justify-center space-x-4' onClick={nukeRemoteStore} > - <FontAwesomeIcon className='w-5 h-5' icon={faRadiation} /> + <Radiation className='w-5 h-5' /> <span>{t('Nuke')}</span> - <FontAwesomeIcon className='w-5 h-5' icon={faRadiation} /> + <Radiation className='w-5 h-5' /> </Button> ) : ( t('Not synced') diff --git a/src/contexts/authentication-context.tsx b/src/contexts/authentication-context.tsx index 275c4adb8ea5bfad50afda45d5691cd59160c3c1..69848f8302463624cb63225f08011e48decd8ed9 100644 --- a/src/contexts/authentication-context.tsx +++ b/src/contexts/authentication-context.tsx @@ -1,4 +1,4 @@ -import { WithChildren } from '@types'; +import { WithChildren } from 'src/types'; import React, { FC, useCallback, useEffect, useMemo, useState } from 'react'; import { useUtils } from 'src/contexts/utils-context'; diff --git a/src/contexts/dm-client-context.tsx b/src/contexts/dm-client-context.tsx index f5991f0fd2062a4b27d0d629201cd073dbb9a9fe..4393b82c735efa1f3e567573bb214ec9e7dfa3f4 100644 --- a/src/contexts/dm-client-context.tsx +++ b/src/contexts/dm-client-context.tsx @@ -1,5 +1,4 @@ import { - MessageStatus, type CMix, type DBConversation, type DBDirectMessage, @@ -9,16 +8,17 @@ import { type Message, WithChildren, DatabaseCipher, - MessageType + MessageType, + MessageStatus } from 'src/types'; import type { Conversation } from 'src/store/dms/types'; import { FC, createContext, useCallback, useContext, useEffect, useMemo, useState } from 'react'; -import assert from 'assert'; import { useUtils, XXDKContext } from '@contexts/utils-context'; import { MAXIMUM_PAYLOAD_BLOCK_SIZE, DMS_DATABASE_NAME as DMS_DATABASE_NAME } from 'src/constants'; -import { decoder, HTMLToPlaintext, inflate } from '@utils/index'; +import { decoder, HTMLToPlaintext } from '@utils/index'; +import { inflate } from '@utils/compression'; import { AppEvents, DMEvents, useAppEventValue, useDmListener } from 'src/events'; import { useDb } from '@contexts/db-context'; import { useAppDispatch, useAppSelector } from 'src/store/hooks'; @@ -30,6 +30,7 @@ import useLocalStorage from 'src/hooks/useLocalStorage'; import { onDmEvent, appBus as bus } from 'src/events'; import { dmIndexedDbWorkerPath } from 'xxdk-wasm'; +import { ChannelManager } from 'public/xxdk-wasm/dist/src/types'; const DMClientContext = createContext<{ cipher?: DatabaseCipher; client?: DMClient }>({}); @@ -80,7 +81,7 @@ const makeMessageMapper = ...codenameConverter(message.sender_pub_key, message.codeset_version), uuid: message.id, id: message.message_id, - status: message.status, + status: message.status as unknown as MessageStatus, type: message.type, channelId: message.conversation_pub_key, repliedTo: @@ -169,7 +170,9 @@ export const DMContextProvider: FC<WithChildren> = ({ children }) => { const createDMClient = useCallback( async (cmix: CMix, cipher: DatabaseCipher, privateIdentity: Uint8Array) => { - assert(privateIdentity, 'Private identity required for dmClient'); + if (!privateIdentity) { + throw new Error('Private identity required for dmClient'); + } try { const workerPath = (await dmIndexedDbWorkerPath()).toString(); @@ -190,19 +193,21 @@ export const DMContextProvider: FC<WithChildren> = ({ children }) => { [NewDMClientWithIndexedDb, utils] ); - const rawPassword = useAppEventValue(AppEvents.PASSWORD_ENTERED); - const decryptedPassword = useAppEventValue(AppEvents.PASSWORD_DECRYPTED); - const cmix = useAppEventValue(AppEvents.CMIX_LOADED); - const channelManager = useAppEventValue(AppEvents.CHANNEL_MANAGER_LOADED); + const rawPassword = useAppEventValue(AppEvents.PASSWORD_ENTERED) as string; + const decryptedPassword = useAppEventValue(AppEvents.PASSWORD_DECRYPTED) as Uint8Array; + const cmix = useAppEventValue(AppEvents.CMIX_LOADED) as CMix; + const channelManager = useAppEventValue( + AppEvents.CHANNEL_MANAGER_LOADED + ) as unknown as ChannelManager; useEffect(() => { if (rawPassword && decryptedPassword && cmix && channelManager) { const privateIdentity = utils.ImportPrivateIdentity( - rawPassword, - channelManager.ExportPrivateIdentity(rawPassword) + rawPassword as string, + channelManager.ExportPrivateIdentity(rawPassword as string) ); - const cipher = createDatabaseCipher(cmix, decryptedPassword); - createDMClient(cmix, cipher, privateIdentity); + const cipher = createDatabaseCipher(cmix as CMix, decryptedPassword as Uint8Array); + createDMClient(cmix as CMix, cipher, privateIdentity); } }, [ channelManager, @@ -287,7 +292,10 @@ export const DMContextProvider: FC<WithChildren> = ({ children }) => { } dispatch(dms.actions.upsertDirectMessage(decryptedMessage)); - if (messageIsNew && message.status === MessageStatus.Delivered) { + if ( + messageIsNew && + (message.status as unknown as MessageStatus) === MessageStatus.Delivered + ) { bus.emit(AppEvents.DM_PROCESSED, decryptedMessage); } }); diff --git a/src/contexts/network-client-context.tsx b/src/contexts/network-client-context.tsx index 23064f1170f51ae1adbed1ecb9f3e025443cefb1..5b5f3639ef5909c5bd3fefc769f8c1e659793fbf 100644 --- a/src/contexts/network-client-context.tsx +++ b/src/contexts/network-client-context.tsx @@ -16,7 +16,6 @@ import { MessageType, PrivacyLevel, type Message, type WithChildren } from 'src/ import React, { FC, useState, useEffect, useCallback, useMemo } from 'react'; import Cookies from 'js-cookie'; -import assert from 'assert'; import { AppEvents, @@ -26,7 +25,8 @@ import { onChannelEvent, useChannelsListener } from 'src/events'; -import { HTMLToPlaintext, decoder, encoder, exportDataToFile, inflate } from 'src/utils'; +import { HTMLToPlaintext, decoder, encoder, exportDataToFile } from 'src/utils'; +import { inflate } from 'src/utils/compression'; import { useAuthentication } from 'src/contexts/authentication-context'; import { useUtils } from 'src/contexts/utils-context'; import { @@ -393,7 +393,7 @@ export const NetworkProvider: FC<WithChildren> = (props) => { const dbMessageMapper = useCallback( (dbMsg: DBMessage): Message => { - assert(cipher, 'Cipher required'); + if (!cipher) throw new Error('Cipher required'); const decrypted = cipher.decrypt(dbMsg.text); const inflated = dbMsg.type !== MessageType.Reaction ? inflate(decrypted) : decrypted; @@ -409,7 +409,7 @@ export const NetworkProvider: FC<WithChildren> = (props) => { timestamp: dbMsg.timestamp, nickname: dbMsg.nickname || '', channelId: dbMsg.channel_id, - status: dbMsg.status, + status: dbMsg.status as unknown as MessageStatus, uuid: dbMsg.id, round: dbMsg.round, pubkey: dbMsg.pubkey, @@ -449,11 +449,13 @@ export const NetworkProvider: FC<WithChildren> = (props) => { useChannelsListener(ChannelEvents.MESSAGE_RECEIVED, handleMessageEvent); const fetchChannels = useCallback(async () => { - assert(db); - assert(channelManager); + console.log('fetchedChannels'); + if (!db || !channelManager) throw new Error('DB and channel manager required'); const fetchedChannels = await db.table<DBChannel>('channels').toArray(); + console.log('fetchedChannels', JSON.stringify(fetchedChannels)); + const channelList = fetchedChannels.map((ch: DBChannel) => ({ ...ch, privacyLevel: getPrivacyLevel(ch.id), @@ -464,7 +466,7 @@ export const NetworkProvider: FC<WithChildren> = (props) => { }, [channelManager, db, dispatch, getPrivacyLevel, utils]); const fetchMessages = useCallback(async () => { - assert(db, 'DB required to fetch messages'); + if (!db) throw new Error('DB required to fetch messages'); const msgs: DBMessage[] = await db .table<DBMessage>('messages') .orderBy('timestamp') @@ -478,18 +480,21 @@ export const NetworkProvider: FC<WithChildren> = (props) => { }, [db, dbMessageMapper, dispatch]); const fetchInitialData = useCallback(async () => { - try { - assert(db); - assert(cmix); - assert(channelManager); - } catch (e) { + console.log('Fetching initial data...'); + if (!channelManager) { + console.log('No channel manager available'); return; } - fetchIdentity(); - await fetchChannels(); - await fetchMessages(); - appBus.emit(AppEvents.MESSAGES_FETCHED, true); - }, [channelManager, cmix, db, fetchChannels, fetchIdentity, fetchMessages]); + + try { + fetchIdentity(); + await fetchChannels(); + await fetchMessages(); + appBus.emit(AppEvents.MESSAGES_FETCHED, true); + } catch (err) { + console.error('Error fetching initial data:', err); + } + }, [channelManager, fetchChannels, fetchIdentity, fetchMessages]); useEffect(() => { if (!currentChannel && currentChannels.length > 0 && currentConversationId === null) { @@ -497,14 +502,9 @@ export const NetworkProvider: FC<WithChildren> = (props) => { } }, [currentChannel, currentChannels, currentConversationId, dispatch]); - useEffect(() => { - if (db && channelManager && cmix) { - fetchInitialData(); - } - }, [db, cmix, channelManager, fetchInitialData]); - const loadChannelManager = useCallback( async (tag: string) => { + console.log('Loading channel manager with tag:', tag); if (cmixId !== undefined && cipher && utils) { const notifications = utils.LoadNotificationsDummy(cmixId); const loadedChannelsManager = await utils.LoadChannelsManagerWithIndexedDb( @@ -513,9 +513,7 @@ export const NetworkProvider: FC<WithChildren> = (props) => { tag, new Uint8Array(), notifications.GetID(), - { - EventUpdate: onChannelEvent - }, + { EventUpdate: onChannelEvent }, cipher?.id ); @@ -527,11 +525,53 @@ export const NetworkProvider: FC<WithChildren> = (props) => { ); useEffect(() => { - if (cmix && cipher && utils && storageTag) { - loadChannelManager(storageTag); + console.log('Ready load channel manager dependencies:', { + hasCmix: !!cmix, + hasCipher: !!cipher, + hasUtils: !!utils, + storageTag + }); + + if (cmix && cipher && utils) { + if (storageTag) { + loadChannelManager(storageTag); + } else { + console.log( + 'No storage tag found, channel manager should have been created during registration/import' + ); + } } }, [cipher, cmix, loadChannelManager, storageTag, utils]); + const createChannelManager = useCallback( + async (privIdentity: Uint8Array) => { + console.log('Creating channel manager...'); + if (cmixId !== undefined && cipher && utils && utils.NewChannelsManagerWithIndexedDb) { + const workerPath = (await channelsIndexedDbWorkerPath()).toString(); + const notifications = utils.LoadNotificationsDummy(cmixId); + const createdChannelManager = await utils.NewChannelsManagerWithIndexedDb( + cmixId, + workerPath, + privIdentity, + new Uint8Array(), + notifications.GetID(), + { EventUpdate: onChannelEvent }, + cipher.id + ); + + const tag = createdChannelManager.GetStorageTag(); + console.log('Got storage tag from creation:', tag); + if (tag) { + setStorageTag(tag); + } + + setChannelManager(createdChannelManager); + appBus.emit(AppEvents.CHANNEL_MANAGER_LOADED, createdChannelManager); + } + }, + [cmixId, cipher, utils, setStorageTag] + ); + const getMutedUsers = useCallback(async () => { let users: User[] = []; @@ -580,35 +620,6 @@ export const NetworkProvider: FC<WithChildren> = (props) => { return users; }, [channelManager, currentChannel, db, dispatch, getCodeNameAndColor, utils]); - const createChannelManager = useCallback( - async (privIdentity: Uint8Array) => { - if (cmixId !== undefined && cipher && utils && utils.NewChannelsManagerWithIndexedDb) { - const workerPath = (await channelsIndexedDbWorkerPath()).toString(); - //console.log('WORKERPATHCHANNELS: ' + workerPath) - const notifications = utils.LoadNotificationsDummy(cmixId); - const createdChannelManager = await utils.NewChannelsManagerWithIndexedDb( - cmixId, - workerPath, - privIdentity, - new Uint8Array(), - notifications.GetID(), - { EventUpdate: onChannelEvent }, - cipher.id - ); - - setChannelManager(createdChannelManager); - - appBus.emit(AppEvents.CHANNEL_MANAGER_LOADED, createdChannelManager); - - const tag = createdChannelManager.GetStorageTag(); - if (tag) { - setStorageTag(tag); - } - } - }, - [cmixId, cipher, utils, setStorageTag] - ); - const [hasMore, setHasMore] = useState(true); useEffect(() => { @@ -755,23 +766,38 @@ export const NetworkProvider: FC<WithChildren> = (props) => { const sendMessage = useCallback( async (message: string, tags: string[] = []) => { - if (message.length && channelManager && utils && utils.Base64ToUint8Array && currentChannel) { - try { - await channelManager.SendMessage( + if (!message.length || !utils?.Base64ToUint8Array) { + console.error('Cannot send message - missing required dependencies:', { + messageLength: !!message.length, + channelManager: !!channelManager, + base64Uint8Array: !!utils?.Base64ToUint8Array, + currentChannel: !!currentChannel + }); + return; + } + try { + if (channelManager && currentChannel) { + const messageId = await channelManager.SendMessage( utils.Base64ToUint8Array(currentChannel.id), message, MESSAGE_LEASE, new Uint8Array(), encoder.encode(JSON.stringify(tags)) ); - } catch (e) { - console.error('Error sending message', e); + + // Log to verify the message was sent and we got a messageId back + console.log('Message sent successfully, messageId:', messageId); + + return messageId; + } else if (currentConversation) { + sendDirectMessage(message); } - } else if (currentConversation) { - sendDirectMessage(message); + } catch (e) { + console.error('Error sending message:', e); + throw e; // Propagate error to caller } }, - [channelManager, currentChannel, sendDirectMessage, currentConversation, utils] + [channelManager, currentChannel, utils] ); const sendReply = useCallback( @@ -951,17 +977,18 @@ export const NetworkProvider: FC<WithChildren> = (props) => { selectedPrivateIdentity: Uint8Array, onIsReadyInfoChange: (readinessInfo: IsReadyInfoJSON) => void ) => { + console.log('Checking registration readiness...'); return new Promise<void>((resolve) => { const intervalId = setInterval(() => { if (cmix) { const isReadyInfo = isReadyInfoDecoder( JSON.parse(decoder.decode(cmix?.IsReady(CMIX_NETWORK_READINESS_THRESHOLD))) ); - onIsReadyInfoChange(isReadyInfo); if (isReadyInfo.isReady) { clearInterval(intervalId); setTimeout(() => { + console.log('Network ready, creating channel manager...'); createChannelManager(selectedPrivateIdentity); setIsAuthenticated(true); resolve(); @@ -1074,6 +1101,13 @@ export const NetworkProvider: FC<WithChildren> = (props) => { } }, [utils]); + useEffect(() => { + if (channelManager) { + console.log('Channel manager loaded, fetching initial data'); + fetchInitialData(); + } + }, [channelManager, fetchInitialData]); + const ctx: NetworkContext = { decryptMessageContent: cipher?.decrypt, channelManager, diff --git a/src/contexts/remote-kv-context.tsx b/src/contexts/remote-kv-context.tsx index c14ef6113b6a7d73d5e6980f5193fc4ac11350b4..d53249ea092eb9efad859b442959fb50f92476a2 100644 --- a/src/contexts/remote-kv-context.tsx +++ b/src/contexts/remote-kv-context.tsx @@ -1,4 +1,5 @@ import { createContext, useEffect, useState, FC, useContext } from 'react'; +import { Buffer } from 'buffer'; import { KV_VERSION, OperationType, RemoteKV, RemoteStore } from 'src/types/collective'; import { encoder } from 'src/utils/index'; diff --git a/src/contexts/sound-context.tsx b/src/contexts/sound-context.tsx new file mode 100644 index 0000000000000000000000000000000000000000..34f187028b551f3fe87113b0bf1ea74dd09ac3e7 --- /dev/null +++ b/src/contexts/sound-context.tsx @@ -0,0 +1,26 @@ +import { createContext, FC, useContext, useState, useCallback } from 'react'; +import { useRemotelySynchedString } from 'src/hooks/useRemotelySynchedValue'; +import NotificationSound from '@components/common/NotificationSound'; + +type SoundContextType = { + playNotification: (() => void) | null; +}; + +const SoundContext = createContext<SoundContextType>({ playNotification: null }); + +export const SoundProvider: FC<{ children: React.ReactNode }> = ({ children }) => { + const [playNotification, setPlayNotification] = useState<(() => void) | null>(null); + const { value: notificationSound } = useRemotelySynchedString( + 'notification-sound', + '/sounds/notification.mp3' + ); + + return ( + <SoundContext.Provider value={{ playNotification }}> + <NotificationSound soundUrl={notificationSound ?? ''} onInit={setPlayNotification} /> + {children} + </SoundContext.Provider> + ); +}; + +export const useSound = () => useContext(SoundContext); diff --git a/src/contexts/ui-context.tsx b/src/contexts/ui-context.tsx index 9521ebb8977bfb4fa21ee261f16282c6e8033022..5140a120a91daa70d80d571680e2f33d34e30c5d 100644 --- a/src/contexts/ui-context.tsx +++ b/src/contexts/ui-context.tsx @@ -1,9 +1,9 @@ -import { WithChildren } from '@types'; +import { WithChildren } from 'src/types'; import React, { FC, useCallback, useEffect, useMemo, useState } from 'react'; import { SettingsView, LeftSidebarView, RightSidebarView } from 'src/types/ui'; import toast, { Toaster } from 'react-hot-toast'; -import Alert, { AlertType } from '@components/common/Alert'; -import { EmojiPortal } from '@components/common/EmojiPortal'; +import Alert, { AlertType } from 'src/components/common/Alert'; +import { EmojiPortal } from 'src/components/common/EmojiPortal'; export type ModalViews = | 'SHARE_CHANNEL' diff --git a/src/contexts/utils-context.tsx b/src/contexts/utils-context.tsx index 0b687216c72e54bfa021d9a6a83517819482a1bd..450c4dd8e2bb6f2b811ec0d13f8c9afb6e95059b 100644 --- a/src/contexts/utils-context.tsx +++ b/src/contexts/utils-context.tsx @@ -1,16 +1,16 @@ -import type { CMix, DummyTraffic, RawCipher, WithChildren } from '@types'; +import type { CMix, DummyTraffic, RawCipher, WithChildren } from 'src/types'; import type { ChannelManager } from './network-client-context'; import type { DMClient } from 'src/types'; import React, { FC, useCallback, useState } from 'react'; -import { decoder } from '@utils/index'; +import { decoder } from 'src/utils/index'; import Loading from 'src/components/views/LoadingView'; -import { identityDecoder } from '@utils/decoders'; +import { identityDecoder } from 'src/utils/decoders'; import { RemoteStore } from 'src/types/collective'; import { ChannelEventHandler, DMEventHandler } from 'src/events'; -import { WebAssemblyRunner } from '@components/common'; +import { WebAssemblyRunner } from 'src/components/common'; import { useTranslation } from 'react-i18next'; -import { PrivacyLevel } from '@types'; +import { PrivacyLevel } from 'src/types'; import { CMIX_INITIALIZATION_KEY } from 'src/constants'; export type ChannelManagerCallbacks = { diff --git a/src/env.d.ts b/src/env.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..e44b82fb33c9d6f5651af2bc57a4a42902cd5dbb --- /dev/null +++ b/src/env.d.ts @@ -0,0 +1,9 @@ +/// <reference types="vite/client" /> + +interface ImportMetaEnv { + readonly APP_VERSION: string; +} + +interface ImportMeta { + readonly env: ImportMetaEnv; +} diff --git a/src/events/app.ts b/src/events/app.ts index 8f21c1f719a6c94ec4ab5e5ac92ebaa59b0b6ea0..ac59ad3a02903f2556b0d8e4d866fed34fb6ea5e 100644 --- a/src/events/app.ts +++ b/src/events/app.ts @@ -6,11 +6,11 @@ import { MessageUnPinEvent, RemoteStore, TypedEventEmitter -} from '@types'; -import { makeEventAwaiter, makeEventHook, makeListenerHook } from '@utils/index'; +} from 'src/types'; +import { makeEventAwaiter, makeEventHook, makeListenerHook } from 'src/utils/index'; import { AccountSyncService } from 'src/hooks/useAccountSync'; import EventEmitter from 'events'; -import { ChannelManager } from '@contexts/network-client-context'; +import { ChannelManager } from 'src/contexts/network-client-context'; export enum AppEvents { MESSAGE_PINNED = 'pinned', diff --git a/src/events/channels.ts b/src/events/channels.ts index 03b9d04113dc56a50d52be0bc4e1052bc2c69c4a..fc5865e26a541ad820f154ba0a5b9aab13a3de35 100644 --- a/src/events/channels.ts +++ b/src/events/channels.ts @@ -8,7 +8,7 @@ import { NotificationUpdateEvent, TypedEventEmitter, UserMutedEvent -} from '@types'; +} from 'src/types'; import { Decoder, adminKeysUpdateDecoder, @@ -19,8 +19,8 @@ import { nicknameUpdatedEventDecoder, notificationUpdateEventDecoder, userMutedEventDecoder -} from '@utils/decoders'; -import { makeEventAwaiter, makeListenerHook } from '@utils/index'; +} from 'src/utils/decoders'; +import { makeEventAwaiter, makeListenerHook } from 'src/utils/index'; import EventEmitter from 'events'; export enum ChannelEvents { @@ -70,7 +70,6 @@ export const onChannelEvent = (eventType: ChannelEvents, data: unknown) => { if (!eventDecoder) { console.error('Unhandled channel event:', eventType, data); } else { - // eslint-disable-next-line @typescript-eslint/no-explicit-any channelsBus.emit(eventType, eventDecoder(data) as any); } }; diff --git a/src/events/dm.ts b/src/events/dm.ts index b4800170f1cb147ab62db6da91d6549a50e599d0..a97b8c2f857d4c11ff29bc46f14f383ff42280a8 100644 --- a/src/events/dm.ts +++ b/src/events/dm.ts @@ -3,13 +3,13 @@ import { DMNotificationsUpdateEvent, DMReceivedEvent, TypedEventEmitter -} from '@types'; +} from 'src/types'; import { Decoder, dmNotificationsUpdateEventDecoder, blockedUserEventDecoder, dmReceivedEventDecoder -} from '@utils/decoders'; +} from 'src/utils/decoders'; import { makeEventAwaiter, makeListenerHook } from '@utils/index'; import EventEmitter from 'events'; @@ -45,7 +45,6 @@ export const onDmEvent = (eventType: DMEvents, data: unknown) => { if (!eventDecoder) { console.error('Unhandled channel event:', eventType, data); } else { - // eslint-disable-next-line @typescript-eslint/no-explicit-any dmBus.emit(eventType, eventDecoder(data) as any); } }; diff --git a/src/hooks/useAsync.ts b/src/hooks/useAsync.ts index 106e490c04021809792a22cb45a8853fea2a5014..0c30c587a4f5a50ced2131e3eebf1f66ebf34068 100644 --- a/src/hooks/useAsync.ts +++ b/src/hooks/useAsync.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ import { useCallback, useState } from 'react'; type AsyncStatus = 'idle' | 'pending' | 'success' | 'error'; diff --git a/src/hooks/useAudioContext.tsx b/src/hooks/useAudioContext.tsx new file mode 100644 index 0000000000000000000000000000000000000000..fd160d8188ce6d333d8a92aa5b8e204ef62aadfc --- /dev/null +++ b/src/hooks/useAudioContext.tsx @@ -0,0 +1,43 @@ +import { useEffect, useRef } from 'react'; + +export const useAudioContext = () => { + const initialized = useRef(false); + + useEffect(() => { + if (initialized.current) return; + + const initAudio = async () => { + // Create a temporary audio context to request permission + const tempContext = new (window.AudioContext || (window as any).webkitAudioContext)(); + await tempContext.resume(); + + // Clean up temp context + await tempContext.close(); + + initialized.current = true; + + // Cleanup listeners once initialized + window.removeEventListener('click', initAudio, true); + window.removeEventListener('touchstart', initAudio, true); + window.removeEventListener('keydown', initAudio, true); + }; + + // Wrap the async function + const handleInteraction = () => { + initAudio().catch(console.error); + }; + + window.addEventListener('click', handleInteraction, true); + window.addEventListener('touchstart', handleInteraction, true); + window.addEventListener('keydown', handleInteraction, true); + + return () => { + window.removeEventListener('click', handleInteraction, true); + window.removeEventListener('touchstart', handleInteraction, true); + window.removeEventListener('keydown', handleInteraction, true); + }; + }, []); + + // Return whether audio is initialized + return initialized.current; +}; diff --git a/src/hooks/useChannelsStorageTag.ts b/src/hooks/useChannelsStorageTag.ts index e9bcdf97c7aef1b9b9b27f54c2c25a04f47848ba..8f9114f335d0a6639f235d98e70d691e51e34f76 100644 --- a/src/hooks/useChannelsStorageTag.ts +++ b/src/hooks/useChannelsStorageTag.ts @@ -5,7 +5,9 @@ import { makeDecoder } from '@utils/decoders'; const KEY = 'channels-storage-tag'; const useStorageTag = () => { - return useRemotelySynchedValue(KEY, makeDecoder(JsonDecoder.string)); + const result = useRemotelySynchedValue(KEY, makeDecoder(JsonDecoder.string)); + console.log('Ready storage tag value:', result.value); + return result; }; export default useStorageTag; diff --git a/src/hooks/useCmix.ts b/src/hooks/useCmix.ts index d4435c50b6fb726a8d9f12f05c4d4be6ad9735e2..17d86f8ba5b428679c29cfd3cc8f7124bea941ac 100644 --- a/src/hooks/useCmix.ts +++ b/src/hooks/useCmix.ts @@ -1,7 +1,6 @@ import type { CMix, CMixParams, DatabaseCipher, DummyTraffic, RemoteStore } from 'src/types'; import { useCallback, useEffect, useMemo, useState } from 'react'; -import assert from 'assert'; import { useUtils } from '@contexts/utils-context'; import { encoder, decoder } from '@utils/index'; @@ -27,9 +26,18 @@ export enum NetworkStatus { FAILED = 'failed' } +export enum InitState { + UNINITIALIZED = 0, + NEWCMIX = 1, + NEWCMIXCOMPLETED = 2, + LOADCMIX = 3, + LOADCMIXCOMPLETED = 4 +} + const ndf = GetDefaultNDF(); const useCmix = () => { + const [initState, setInitState] = useState<InitState>(InitState.UNINITIALIZED); const { cmixPreviouslyInitialized, rawPassword } = useAuthentication(); const [status, setStatus] = useState<NetworkStatus>(NetworkStatus.UNINITIALIZED); const [dummyTraffic, setDummyTrafficManager] = useState<DummyTraffic>(); @@ -92,23 +100,6 @@ const useCmix = () => { [cmixPreviouslyInitialized, rawPassword, utils] ); - const initializeCmix = useCallback( - async (password: Uint8Array) => { - if (!cmixPreviouslyInitialized) { - await utils.NewCmix(ndf, STATE_PATH, password, ''); - } - }, - [cmixPreviouslyInitialized, utils] - ); - - const loadCmix = useCallback( - async (password: Uint8Array) => { - const loadedCmix = await utils.LoadCmix(STATE_PATH, password, encodedCmixParams); - setCmix(loadedCmix); - }, - [encodedCmixParams, utils] - ); - const connect = useCallback(async () => { if (!cmix) { throw Error('Cmix required'); @@ -203,55 +194,33 @@ const useCmix = () => { } }, [cmix, createDatabaseCipher, decryptedPass]); - const initializeSync = useCallback( - (encryptedPass: Uint8Array, remote: RemoteStore) => { - return initializeSynchronizedCmix(encryptedPass, remote) - .then(() => loadSynchronizedCmix(encryptedPass, remote)) - .then(() => { - bus.emit(AppEvents.CMIX_SYNCED, remote.service); - }) - .catch(() => { - utils.Purge(rawPassword ?? ''); - setStatus(NetworkStatus.FAILED); - }); - }, - [initializeSynchronizedCmix, loadSynchronizedCmix, rawPassword, utils] - ); - - const initialize = useCallback( - (encryptedPass: Uint8Array) => { - return initializeCmix(encryptedPass) - .then(() => loadCmix(encryptedPass)) - .catch((e) => { - setStatus(NetworkStatus.FAILED); - throw e; - }); - }, - [initializeCmix, loadCmix] - ); + // Cmix initialization and loading + const initializeCmix = async (password: Uint8Array) => { + if (!cmixPreviouslyInitialized) { + await utils.NewCmix(ndf, STATE_PATH, password, ''); + } + }; + const loadCmix = async (password: Uint8Array) => { + const loadedCmix = await utils.LoadCmix(STATE_PATH, password, encodedCmixParams); + setCmix(loadedCmix); + }; + useEffect(() => { + if (decryptedPass) { + initializeCmix(decryptedPass).then(() => { + loadCmix(decryptedPass); + }); + } + }, [decryptedPass]); const onPasswordDecryption = useCallback( async (password: Uint8Array) => { setDecryptedPass(password); - if (accountSync.status !== AccountSyncStatus.Synced) { - await initialize(password); - } }, - [accountSync.status, initialize] + [accountSync.status] ); useAppEventListener(AppEvents.PASSWORD_DECRYPTED, onPasswordDecryption); - const onRemoteStoreInitialized = useCallback( - async (remoteStore: RemoteStore) => { - assert(decryptedPass, 'Password required for sync login'); - initializeSync(decryptedPass, remoteStore); - }, - [decryptedPass, initializeSync] - ); - - useAppEventListener(AppEvents.REMOTE_STORE_INITIALIZED, onRemoteStoreInitialized); - useEffect(() => { if (cmix) { cmix.GetRemoteKV().then((rawKv) => { @@ -267,9 +236,7 @@ const useCmix = () => { cipher: databaseCipher, disconnect, id: cmixId, - status, - initialize, - initializeSync + status }; }; diff --git a/src/hooks/useDmClient.ts b/src/hooks/useDmClient.ts index 1e320da3bd8dae9303bbf2ffcdfe89f493a5a216..cb4c413294560a38ecbac3a077339dfb1a415a34 100644 --- a/src/hooks/useDmClient.ts +++ b/src/hooks/useDmClient.ts @@ -60,7 +60,7 @@ const useDmClient = () => { const sendDMReply = useCallback( async (reply: string, replyToMessageId: string) => { if (!client || !currentConversation) { - return; + throw new Error('Current conversation is undefined'); } try { await client?.SendReply( @@ -81,7 +81,7 @@ const useDmClient = () => { const sendDMReaction = useCallback( async (reaction: string, reactToMessageId: string) => { if (!client || !currentConversation) { - return; + throw new Error('Current conversation is undefined'); } try { await client.SendReaction( @@ -168,7 +168,9 @@ const useDmClient = () => { const deleteDirectMessage = useCallback( (messageId: string) => { - assert(currentConversation, 'Current conversation is undefined'); + if (!currentConversation) { + throw new Error('Current conversation is undefined'); + } client?.DeleteMessage( utils.Base64ToUint8Array(currentConversation.pubkey), currentConversation.token, diff --git a/src/hooks/useDropboxRemoteStore.ts b/src/hooks/useDropboxRemoteStore.ts deleted file mode 100644 index b7642619cf527c8169740e698cae61a86df49596..0000000000000000000000000000000000000000 --- a/src/hooks/useDropboxRemoteStore.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { Dropbox } from 'dropbox'; -import { useCallback, useEffect, useState } from 'react'; -import assert from 'assert'; - -import { AppEvents, appBus as bus } from 'src/events'; -import { RemoteStore } from 'src/types/collective'; -import useAccountSync, { AccountSyncService, AccountSyncStatus } from './useAccountSync'; -import { useRemoteStore } from '@contexts/remote-kv-context'; - -const useDropboxRemoteStore = () => { - const [dropbox, setDropbox] = useState<Dropbox>(); - const [remoteStore, setStore] = useRemoteStore(); - const { setService, setStatus } = useAccountSync(); - - useEffect(() => { - const onToken = (accessToken: string) => { - setDropbox(new Dropbox({ accessToken })); - }; - - bus.addListener(AppEvents.DROPBOX_TOKEN, onToken); - - return () => { - bus.removeListener(AppEvents.DROPBOX_TOKEN, onToken); - }; - }, []); - - useEffect(() => { - const listener = () => { - setStore(undefined); - }; - - bus.addListener(AppEvents.NEW_SYNC_CMIX_FAILED, listener); - - return () => { - bus.removeListener(AppEvents.NEW_SYNC_CMIX_FAILED, listener); - }; - }, [setStore]); - - const getBinaryFile = useCallback( - async (name: string) => { - assert(dropbox); - const path = name.charAt(0) !== '/' ? `/${name}` : name; - const res = await dropbox.filesDownload({ path }); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const blob = (res.result as any).fileBlob as Blob; - const buffer = await new Response(blob).arrayBuffer(); - return new Uint8Array(buffer); - }, - [dropbox] - ); - - const writeFile = useCallback( - async (path: string, data: Uint8Array) => { - assert(dropbox); - - const prefixedPath = path.charAt(0) !== '/' ? `/${path}` : path; - await dropbox.filesUpload({ - path: prefixedPath, - contents: data, - mode: { '.tag': 'overwrite' } - }); - }, - [dropbox] - ); - - const getLastModified = useCallback( - async (name: string) => { - assert(dropbox); - const path = name.charAt(0) !== '/' ? `/${name}` : name; - const res = await dropbox.filesDownload({ path }); - return res.result.server_modified; - }, - [dropbox] - ); - - const readDir = useCallback( - async (name: string) => { - assert(dropbox); - const path = name.charAt(0) !== '/' ? `/${name}` : name; - - const res = await dropbox.filesListFolder({ path }); - return res.result.entries.map((e) => e.name); - }, - [dropbox] - ); - - const deleteAllFiles = useCallback(async () => { - assert(dropbox); - const res = await dropbox.filesListFolder({ path: '/', recursive: true }); - const entries = res.result.entries.map((e) => ({ path: e.path_lower || e.name })); - await dropbox.filesDeleteBatch({ entries }); - }, [dropbox]); - - useEffect(() => { - if (dropbox && !remoteStore) { - setStore( - new RemoteStore({ - service: AccountSyncService.Dropbox, - Write: writeFile, - Read: getBinaryFile, - GetLastModified: getLastModified, - ReadDir: readDir, - DeleteAll: deleteAllFiles - }) - ); - setStatus(AccountSyncStatus.Synced); - setService(AccountSyncService.Dropbox); - } - }, [ - deleteAllFiles, - dropbox, - getBinaryFile, - getLastModified, - readDir, - setStore, - writeFile, - setStatus, - setService, - remoteStore - ]); -}; - -export default useDropboxRemoteStore; diff --git a/src/hooks/useEvents.ts b/src/hooks/useEvents.ts index 9e45d9b3bdbd53fb384a82c4f1fc649edad3ef25..26668a96dfcb6afa5059671d1c8b72aaa7568e7b 100644 --- a/src/hooks/useEvents.ts +++ b/src/hooks/useEvents.ts @@ -9,8 +9,10 @@ import { MessageStatus, NicknameUpdatedEvent, NotificationUpdateEvent, - UserMutedEvent -} from '@types'; + UserMutedEvent, + ChannelNotificationLevel, + NotificationStatus +} from 'src/types'; import { useCallback } from 'react'; import * as channels from 'src/store/channels'; @@ -70,8 +72,18 @@ const useEvents = () => { const onNotificationUpdate = useCallback( (evt: NotificationUpdateEvent) => { evt.changedNotificationStates?.forEach((state) => { - dispatch(channels.actions.updateNotificationLevel(state)); - dispatch(channels.actions.updateNotificationStatus(state)); + dispatch( + channels.actions.updateNotificationLevel({ + channelId: state.channelId, + level: state.level as unknown as ChannelNotificationLevel + }) + ); + dispatch( + channels.actions.updateNotificationStatus({ + channelId: state.channelId, + status: state.status as unknown as NotificationStatus + }) + ); }); evt.deletedNotificationStates?.forEach((channelId) => { diff --git a/src/hooks/useGoogleApi.ts b/src/hooks/useGoogleApi.ts deleted file mode 100644 index d7ef565f9da43a1a0abbddcf03965f455f03787a..0000000000000000000000000000000000000000 --- a/src/hooks/useGoogleApi.ts +++ /dev/null @@ -1,40 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import { useState, useEffect } from 'react'; - -type GoogleApiStatus = 'loading' | 'error' | 'ready'; - -interface GoogleApi { - gapi: any; - status: GoogleApiStatus; -} - -declare global { - interface Window { - gapi: any; - } -} - -const useGoogleApi = (): GoogleApi => { - const [status, setStatus] = useState<GoogleApiStatus>('loading'); - const [gapi, setGapi] = useState<any>(null); - - useEffect(() => { - const script = document.createElement('script'); - script.src = 'https://apis.google.com/js/api.js'; - script.onload = () => { - window.gapi.load('client', async () => { - setGapi(window.gapi); - }); - }; - script.onerror = () => setStatus('error'); - document.body.appendChild(script); - - return () => { - document.body.removeChild(script); - }; - }, []); - - return { gapi, status }; -}; - -export default useGoogleApi; diff --git a/src/hooks/useGoogleDrive.ts b/src/hooks/useGoogleDrive.ts deleted file mode 100644 index a2a4ecf8d0d45c895e6a27af28651bdb76d30db0..0000000000000000000000000000000000000000 --- a/src/hooks/useGoogleDrive.ts +++ /dev/null @@ -1,34 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import { useEffect, useState } from 'react'; - -interface GoogleDrive { - drive: any; - ready: boolean; -} - -const useGoogleDrive = (gapi: any, accessToken?: string): GoogleDrive => { - const [drive, setDrive] = useState<any>(null); - const [ready, setReady] = useState<boolean>(false); - - useEffect(() => { - const initDriveApi = async () => { - try { - gapi.client.load('drive', 'v3', async () => { - await gapi.client.setToken({ access_token: accessToken }); - setDrive(gapi.client.drive); - setReady(true); - }); - } catch (error) { - console.error('Error initializing Google Drive API:', error); - } - }; - - if (gapi && accessToken) { - initDriveApi(); - } - }, [accessToken, gapi]); - - return { drive, ready }; -}; - -export default useGoogleDrive; diff --git a/src/hooks/useGoogleRemoteStore.ts b/src/hooks/useGoogleRemoteStore.ts deleted file mode 100644 index 1d32972f15f98e35e196c426dbd44d2745c84182..0000000000000000000000000000000000000000 --- a/src/hooks/useGoogleRemoteStore.ts +++ /dev/null @@ -1,231 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import { useCallback, useEffect, useState } from 'react'; -import { encoder } from '@utils/index'; -import useGoogleDrive from './useGoogleDrive'; -import useGoogleApi from './useGoogleApi'; -import { RemoteStore } from 'src/types/collective'; -import { AppEvents, appBus as bus } from 'src/events'; -import useAccountSync, { AccountSyncService, AccountSyncStatus } from './useAccountSync'; -import { useRemoteStore } from '@contexts/remote-kv-context'; - -const fileIdCache = new Map<string, string>(); - -const prefixFilename = (path: string) => (path.charAt(0) === '/' ? path : `/${path}`); - -const listDirectory = (filenames: string[], search: string) => { - const set = filenames - .reduce((acc: Set<string>, cur: string) => { - const index = cur.indexOf(search); - if (index !== -1) { - const sliced = cur.slice(search.length); - const nextSlash = sliced.indexOf('/'); - acc.add(sliced.slice(0, nextSlash !== -1 ? nextSlash : undefined)); - } - return acc; - }, new Set()) - .values(); - - return Array.from(set); -}; - -const useGoogleRemoteStore = () => { - const [accessToken, setAccessToken] = useState<string>(); - const { gapi } = useGoogleApi(); - const { drive } = useGoogleDrive(gapi, accessToken); - const [remoteStore, setRemoteStore] = useRemoteStore(); - const accountSync = useAccountSync(); - - useEffect(() => { - bus.addListener(AppEvents.GOOGLE_TOKEN, setAccessToken); - - return () => { - bus.removeListener(AppEvents.GOOGLE_TOKEN, setAccessToken); - }; - }, []); - - const deleteFile = useCallback( - (fileId: string) => drive.files.delete({ fileId: fileId }), - [drive?.files] - ); - - const deleteAllFiles = useCallback(async () => { - const res = await drive.files.list({ - spaces: 'appDataFolder', - fields: 'nextPageToken, files(id)', - pageSize: 1000 - }); - - await Promise.all(res.result.files.map((file: any) => deleteFile(file.id))); - }, [drive?.files, deleteFile]); - - const getFile = useCallback( - async (name: string) => - ( - await drive.files.list({ - q: `name = \'${name}\'`, - spaces: 'appDataFolder', - fields: 'nextPageToken, files(id, name, modifiedTime)', - pageSize: 1 - }) - ).result.files[0], - [drive?.files] - ); - - const getLastModified = useCallback( - async (path: string) => { - const file = await getFile(prefixFilename(path)); - - return file.modifiedTime; - }, - [getFile] - ); - - const getFileId = useCallback( - async (name: string): Promise<any> => { - const prefixed = prefixFilename(name); - let id = fileIdCache.get(prefixed); - if (!id) { - const file = await getFile(prefixed); - if (file) { - fileIdCache.set(prefixed, file.id); - id = file.id; - } - } - return id; - }, - [getFile] - ); - - const getBinaryFile = useCallback( - async (name: string) => { - const prefixed = prefixFilename(name); - const fileId = await getFileId(prefixed); - - const contents = await drive.files.get({ - fileId: fileId, - alt: 'media' - }); - - return encoder.encode(contents.body); - }, - [drive?.files, getFileId] - ); - - const readDir = useCallback( - async (folderName: string): Promise<string[]> => { - const filenamesResult = await drive.files.list({ - fields: 'files(id, name)', - spaces: ['appDataFolder'] - }); - - const prefixedFolderName = prefixFilename(folderName); - const suffixedFoldername = - prefixedFolderName.charAt(prefixedFolderName.length - 1) === '/' - ? prefixedFolderName - : `${prefixedFolderName}/`; - - const filenames = filenamesResult.result.files.map((file: any) => prefixFilename(file.name)); - - return listDirectory(filenames, suffixedFoldername); - }, - [drive?.files] - ); - - const uploadBinaryFile = useCallback( - (path: string, data: Uint8Array) => { - return new Promise<string>((res, rej) => { - const file = new Blob([data], { type: 'application/octet-stream' }); - const metadata = { - name: path, - spaces: 'appDataFolder', - mimeType: 'application/octet-stream', - parents: ['appDataFolder'] - }; - - const form = new FormData(); - form.append('metadata', new Blob([JSON.stringify(metadata)], { type: 'application/json' })); - form.append('file', file); - - const xhr = new XMLHttpRequest(); - xhr.open( - 'post', - 'https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart&fields=id' - ); - xhr.setRequestHeader('Authorization', 'Bearer ' + accessToken); - xhr.responseType = 'json'; - xhr.onerror = rej; - xhr.onload = () => { - res(xhr.response.id); // Retrieve uploaded file ID. - }; - xhr.send(form); - }); - }, - [accessToken] - ); - - const updateFile = useCallback( - async (fileId: string, data: Uint8Array) => { - return new Promise<string>((res, rej) => { - const file = new Blob([data], { type: 'application/octet-stream' }); - const metadata = { - fileId, - spaces: 'appDataFolder', - mimeType: 'application/octet-stream' - }; - - const form = new FormData(); - form.append('metadata', new Blob([JSON.stringify(metadata)], { type: 'application/json' })); - form.append('file', file); - - const xhr = new XMLHttpRequest(); - xhr.open( - 'PATCH', - `https://www.googleapis.com/upload/drive/v3/files/${fileId}?uploadType=multipart` - ); - xhr.setRequestHeader('Authorization', 'Bearer ' + accessToken); - xhr.responseType = 'json'; - xhr.onerror = rej; - xhr.onload = () => { - res(xhr.response.id); // Retrieve uploaded file ID. - }; - xhr.send(form); - }); - }, - [accessToken] - ); - - const writeFile = useCallback( - async (path: string, data: Uint8Array) => { - const prefixed = prefixFilename(path); - const existingFileId = await getFileId(prefixed); - - if (existingFileId) { - await updateFile(existingFileId, data); - } else { - const id = await uploadBinaryFile(prefixed, data); - fileIdCache.set(prefixed, id); - } - }, - [getFileId, updateFile, uploadBinaryFile] - ); - - useEffect(() => { - if (drive && accessToken && !remoteStore) { - setRemoteStore( - new RemoteStore({ - service: AccountSyncService.Google, - Write: writeFile, - Read: getBinaryFile, - GetLastModified: getLastModified, - ReadDir: readDir, - DeleteAll: deleteAllFiles - }) - ); - accountSync.setStatus(AccountSyncStatus.Synced); - accountSync.setService(AccountSyncService.Google); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [accessToken, deleteAllFiles, drive, getBinaryFile, getLastModified, readDir, writeFile]); -}; - -export default useGoogleRemoteStore; diff --git a/src/hooks/useNotification.ts b/src/hooks/useNotification.ts index 975b4112378d599f98a001ae96f6af81a2bd8b90..1fdd305368a7be80bb8d519fc0f81242dab794ff 100644 --- a/src/hooks/useNotification.ts +++ b/src/hooks/useNotification.ts @@ -1,18 +1,6 @@ import icon from 'src/assets/images/logo.svg'; -import { useRef, useCallback } from 'react'; +import { useRef, useCallback, useState, useEffect } from 'react'; import { useSessionStorage } from 'usehooks-ts'; -import useSound from 'use-sound'; - -import { - ChannelId, - DBMessage, - Message, - MessageStatus, - MessageType, - ChannelNotificationLevel, - NotificationStatus, - DMNotificationLevel -} from '@types'; import { useAppSelector } from 'src/store/hooks'; import * as identity from 'src/store/identity'; import { useUtils } from '@contexts/utils-context'; @@ -24,6 +12,17 @@ import { EasterEggs, useUI } from '@contexts/ui-context'; import { useNetworkClient } from '@contexts/network-client-context'; import useLocalStorage from './useLocalStorage'; import { useRemotelySynchedString } from './useRemotelySynchedValue'; +import { DMNotificationLevel } from 'src/types/events'; +import { + Message, + ChannelId, + ChannelNotificationLevel, + NotificationStatus, + MessageStatus, + MessageType, + DBMessage +} from 'src/types'; +import { useSound } from 'src/contexts/sound-context'; const useNotification = () => { const { getCodeNameAndColor } = useUtils(); @@ -34,7 +33,7 @@ const useNotification = () => { 'notification-sound', '/sounds/notification.mp3' ); - const [playNotification] = useSound(notificationSound ?? ''); + const { playNotification } = useSound(); const [isPermissionGranted, setIsPermissionGranted] = useLocalStorage<boolean>( 'notification-permission', Notification?.permission === 'granted' @@ -54,7 +53,9 @@ const useNotification = () => { setNickname('Masochist'); } notification.current = new Notification(title, options); - playNotification(); + if (playNotification) { + playNotification(); + } } }, [isPermissionGranted, notificationSound, playNotification, setNickname, triggerEasterEgg] diff --git a/src/hooks/useRemotelySynchedValue.ts b/src/hooks/useRemotelySynchedValue.ts index 6956fefd51f5cc93bea88ed1757fc34ad938359d..68a0f35982051a6cbe3cc8699495f5dbf20ba0ec 100644 --- a/src/hooks/useRemotelySynchedValue.ts +++ b/src/hooks/useRemotelySynchedValue.ts @@ -1,7 +1,6 @@ import { Decoder, makeDecoder } from '@utils/decoders'; import { useCallback, useEffect, useState } from 'react'; -import assert from 'assert'; import { useRemoteKV } from 'src/contexts/remote-kv-context'; import { JsonDecoder } from 'ts.data.json'; @@ -38,7 +37,6 @@ const useRemotelySynchedValue = <T>(key: string, decoder: Decoder<T>, defaultVal }); } // decoders never change - // eslint-disable-next-line react-hooks/exhaustive-deps }, [key, kv]); // Adding this workaround because of the bug where setting the first time @@ -58,9 +56,12 @@ const useRemotelySynchedValue = <T>(key: string, decoder: Decoder<T>, defaultVal const set = useCallback( async (v: T) => { - assert(kv, `Attempted to set value on key ${key} but the store wasn't initialized`); - await kv.set(key, JSON.stringify(v)); - bus.emit('set', key, v); + if (kv) { + await kv.set(key, JSON.stringify(v)); + bus.emit('set', key, v); + } else { + throw new Error(`Attempted to set value on key ${key} but the store wasn't initialized`); + } }, [key, kv] ); diff --git a/src/i18n/backend.ts b/src/i18n/backend.ts index bcff4abb60040e9361bffb858eb098774d39b8bd..6ef9c3a905bbae19a43de20deae09604b6bb08eb 100644 --- a/src/i18n/backend.ts +++ b/src/i18n/backend.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ import languageCache from './cache'; type Callback = (error: string | null, data: any) => void; @@ -17,7 +16,6 @@ export default class Backend { return responder(null, languageCache[lng]); } - // eslint-disable-next-line @typescript-eslint/no-misused-promises if (!loaders[lng]) { loaders[lng] = this.createLoader(lng); } diff --git a/src/layouts/DefaultLayout/AuthenticationUI.tsx b/src/layouts/DefaultLayout/AuthenticationUI.tsx index 413811c8c08988d7fc15a50d76eb79c5fc3be094..d2551d00d57b8a8eee9acbde123cf39caab6aaf9 100644 --- a/src/layouts/DefaultLayout/AuthenticationUI.tsx +++ b/src/layouts/DefaultLayout/AuthenticationUI.tsx @@ -20,7 +20,7 @@ const AuthenticationUI: FC = () => { setIsAuthenticated } = useAuthentication(); const { utils } = useUtils(); - const { checkRegistrationReadiness, cmix } = useNetworkClient(); + const { checkRegistrationReadiness, cmix, createChannelManager } = useNetworkClient(); const [loading, setLoading] = useState(false); const [readyProgress, setReadyProgress] = useState<number>(0); @@ -42,6 +42,7 @@ const AuthenticationUI: FC = () => { checkRegistrationReadiness(importedIdentity, (isReadyInfo) => { setReadyProgress(Math.ceil((isReadyInfo?.howClose || 0) * 100)); if (isReadyInfo.isReady) { + createChannelManager(importedIdentity); setLoading(false); setReadyProgress(0); setIsAuthenticated(true); diff --git a/src/layouts/DefaultLayout/ConnectingDimmer.module.scss b/src/layouts/DefaultLayout/ConnectingDimmer.module.scss deleted file mode 100644 index 51ed37b5a0d8a7cf0b5c160dc0985eb25b617dad..0000000000000000000000000000000000000000 --- a/src/layouts/DefaultLayout/ConnectingDimmer.module.scss +++ /dev/null @@ -1,11 +0,0 @@ -.dimmer { - position: fixed; - width: 100%; - height: 100%; - background: rgba(#000, 0.5); - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - z-index: 20; -} diff --git a/src/layouts/DefaultLayout/ConnectingDimmer.tsx b/src/layouts/DefaultLayout/ConnectingDimmer.tsx index 851c4571d7c68905849c811901b71ca930cde581..23628e34d34f0154fc32389c4d1dfa6b14300b63 100644 --- a/src/layouts/DefaultLayout/ConnectingDimmer.tsx +++ b/src/layouts/DefaultLayout/ConnectingDimmer.tsx @@ -2,13 +2,11 @@ import { Spinner } from '@components/common'; import { NetworkStatus, useNetworkClient } from '@contexts/network-client-context'; import React from 'react'; -import s from './ConnectingDimmer.module.scss'; - const ConnectingDimmer = () => { const { networkStatus } = useNetworkClient(); return networkStatus === NetworkStatus.CONNECTING ? ( - <div className={s.dimmer}> + <div className='fixed w-full h-full bg-black/50 flex flex-col justify-center items-center z-20'> <Spinner size='md' /> <p>Connecting to the network...</p> </div> diff --git a/src/layouts/DefaultLayout/DefaultLayout.tsx b/src/layouts/DefaultLayout/DefaultLayout.tsx index ddd2931056590648d5217d9601494acdceabde34..bd92f340232bc06e48de55bd8ba19faacd5ad8fc 100644 --- a/src/layouts/DefaultLayout/DefaultLayout.tsx +++ b/src/layouts/DefaultLayout/DefaultLayout.tsx @@ -1,7 +1,7 @@ import type { WithChildren } from 'src/types'; import React, { FC, useEffect } from 'react'; -import { useRouter } from 'next/router'; +import { useLocation } from 'react-router-dom'; import { useUI } from 'src/contexts/ui-context'; import { useNetworkClient } from 'src/contexts/network-client-context'; @@ -11,13 +11,11 @@ import AuthenticationUI from './AuthenticationUI'; import NotificationBanner from 'src/components/common/NotificationBanner'; import LeftHeader from 'src/components/common/LeftHeader'; -import UpdatesModal from '../../components/modals/UpdatesModal'; +import UpdatesModal from 'src/components/modals/UpdatesModal'; import ConnectingDimmer from './ConnectingDimmer'; import useAccountSync, { AccountSyncStatus } from 'src/hooks/useAccountSync'; import { NetworkStatus } from 'src/hooks/useCmix'; import useEvents from 'src/hooks/useEvents'; -import useGoogleRemoteStore from 'src/hooks/useGoogleRemoteStore'; -import useDropboxRemoteStore from 'src/hooks/useDropboxRemoteStore'; import LeftSideBar from '@components/common/LeftSideBar'; import MainHeader from '@components/common/MainHeader'; @@ -29,11 +27,9 @@ import { RightSideBar } from '@components/common'; import PinnedMessage from '@components/common/ChannelChat/PinnedMessage'; const DefaultLayout: FC<WithChildren> = ({ children }) => { - useGoogleRemoteStore(); - useDropboxRemoteStore(); useEvents(); const accountSync = useAccountSync(); - const router = useRouter(); + const location = useLocation(); const { isAuthenticated } = useAuthentication(); const { cmix, getShareUrlType, networkStatus } = useNetworkClient(); const { leftSidebarView: sidebarView, openModal, setChannelInviteLink, setModalView } = useUI(); @@ -46,7 +42,7 @@ const DefaultLayout: FC<WithChildren> = ({ children }) => { cmix && networkStatus === NetworkStatus.CONNECTED && isAuthenticated && - window.location.search + location.search ) { setChannelInviteLink(window.location.href); setModalView('JOIN_CHANNEL'); @@ -60,7 +56,7 @@ const DefaultLayout: FC<WithChildren> = ({ children }) => { setChannelInviteLink, setModalView, openModal, - router + location.search ]); useEffect(() => { diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 0000000000000000000000000000000000000000..fe89b838989a59e2a931a2fabbc1b937725a1fb4 --- /dev/null +++ b/src/main.tsx @@ -0,0 +1,16 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import { RouterProvider } from 'react-router-dom'; +import { HelmetProvider } from 'react-helmet-async'; +import { router } from './router'; +import './i18n'; +import './utils/extend-dayjs'; +import './assets/css/globals.css'; + +ReactDOM.createRoot(document.getElementById('root')!).render( + <React.StrictMode> + <HelmetProvider> + <RouterProvider router={router} /> + </HelmetProvider> + </React.StrictMode> +); diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx deleted file mode 100644 index 342d2977bc6432b906e0c5767df1da55ea6778ab..0000000000000000000000000000000000000000 --- a/src/pages/_app.tsx +++ /dev/null @@ -1,166 +0,0 @@ -import type { WithChildren } from 'src/types'; -import React, { FC, useEffect, useState } from 'react'; - -import { NextSeo } from 'next-seo'; -import { AppProps } from 'next/app'; -import Head from 'next/head'; -// import { useRouter } from 'next/router'; -import { Provider } from 'react-redux'; -import { useTranslation } from 'react-i18next'; - -import store from 'src/store'; -import { ManagedUIContext } from 'src/contexts/ui-context'; -import { ManagedNetworkContext } from 'src/contexts/network-client-context'; -import { AuthenticationProvider } from 'src/contexts/authentication-context'; -import { UtilsProvider } from 'src/contexts/utils-context'; -import { isDuplicatedWindow } from 'src/utils/oneTabEnforcer'; - -import 'src/assets/scss/main.scss'; -import 'src/assets/scss/quill-overrides.scss'; -import 'react-tooltip/dist/react-tooltip.css'; -import ErrorBoundary from 'src/components/common/ErrorBoundary'; -import { DBProvider } from '@contexts/db-context'; -import '../i18n'; -import 'src/utils/extend-dayjs'; -import { RemoteKVProvider } from '@contexts/remote-kv-context'; -import { DMContextProvider } from '@contexts/dm-client-context'; - -// const regexp = /android|iphone|iPhone|kindle|ipad|iPad|Harmony|harmony|Tizen|tizen/i; -// const isDesktop = () => { -// const details = navigator.userAgent; -// return !regexp.test(details); -// }; - -const Noop: FC<WithChildren> = ({ children }) => <>{children}</>; - -export const WarningComponent: FC<WithChildren> = ({ children }) => { - const { t } = useTranslation(); - return ( - <> - <Head> - <title>{t('Internet Haven')}</title> - <link rel='icon' href='/favicon.svg' /> - </Head> - <div className='h-screen w-full flex justify-center items-center px-20'> - <h1 - className='headline m-auto text-center' - style={{ - fontSize: '48px', - color: 'var(--cyan)', - lineHeight: '1.2' - }} - > - {children} - </h1> - </div> - </> - ); -}; - -const SEO = () => { - const [url, setUrl] = useState(''); - const [origin, setOrigin] = useState(''); - useEffect(() => { - setUrl(`${window.location.origin}${window.location.pathname}`); - setOrigin(window.location.origin); - }, []); - return ( - <NextSeo - openGraph={{ - type: 'website', - url: url, - title: 'Haven', - description: - 'The internet Haven. True Freedom to express yourself, your thoughts, your beliefs. Speak easily to a group of friends or a global community. Talk about what you want. Surveillance free. Censorship proof. Your Haven chats are yours.', - images: [ - { - url: `${origin}/haven-icon.png`, - width: 200, - height: 43, - alt: 'Haven' - } - ] - }} - /> - ); -}; - -const Providers: FC<WithChildren> = ({ children }) => ( - <RemoteKVProvider> - <DBProvider> - <Provider store={store}> - <UtilsProvider> - <AuthenticationProvider> - <DMContextProvider> - <ManagedNetworkContext> - <ManagedUIContext>{children}</ManagedUIContext> - </ManagedNetworkContext> - </DMContextProvider> - </AuthenticationProvider> - </UtilsProvider> - </Provider> - </DBProvider> - </RemoteKVProvider> -); - -const HavenApp = ({ Component, pageProps }: AppProps) => { - const { t } = useTranslation(); - const [shouldRender, setShouldRender] = useState(false); - - useEffect(() => { - setShouldRender(true); - }, []); - // const router = useRouter(); - - // useEffect(() => { - // if (!isDesktop()) { - // router.push('https://haven.xx.network/mobile/'); - // } - // }, [router]); - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const Layout = (Component as any).Layout || Noop; - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const skipDuplicateTabCheck = (Component as any).skipDuplicateTabCheck; - - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const AllProviders = (Component as any).skipProviders ? React.Fragment : Providers; - - if (shouldRender) { - return ( - <ErrorBoundary> - <Head> - <title>{t('internet haven')}</title> - <link rel='icon' href='/favicon.svg' /> - </Head> - <SEO /> - <AllProviders> - {!skipDuplicateTabCheck && isDuplicatedWindow(15000, 10000, 'HavenApp') ? ( - <WarningComponent> - {t('Haven can only run with one tab/window at a time.')} - <br /> - {t('Return to your Haven home tab to continue.')} - </WarningComponent> - ) : ( - <Layout pageProps={{ ...pageProps }}> - <Component {...pageProps} /> - </Layout> - )} - </AllProviders> - </ErrorBoundary> - ); - } else { - return ( - <ErrorBoundary> - <Head> - <title>{t('internet haven')}</title> - <link rel='icon' href='/favicon.svg' /> - </Head> - <SEO /> - </ErrorBoundary> - ); - } -}; - -export default HavenApp; diff --git a/src/pages/_document.tsx b/src/pages/_document.tsx deleted file mode 100644 index 8d743e5b2c7f2670df1b4845d0ee69be1ca27b58..0000000000000000000000000000000000000000 --- a/src/pages/_document.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import { Head, Html, Main, NextScript } from 'next/document'; - -const MyDocument = () => ( - <Html> - <Head /> - <div id='emoji-portal' /> - <body className='loading'> - <Main /> - <NextScript /> - </body> - </Html> -); - -export default MyDocument; diff --git a/src/pages/api/__coverage__.js b/src/pages/api/__coverage__.js deleted file mode 100644 index 0b11fc9bc29e9c85ec98f30d12e01904a0aa1dda..0000000000000000000000000000000000000000 --- a/src/pages/api/__coverage__.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require('@cypress/code-coverage/middleware/nextjs'); diff --git a/src/pages/dropbox.tsx b/src/pages/dropbox.tsx deleted file mode 100644 index e155903fb663a28b0c8f8a6909136d2905cf124c..0000000000000000000000000000000000000000 --- a/src/pages/dropbox.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { NextPage } from 'next'; -import { useEffect } from 'react'; -import { useTranslation } from 'react-i18next'; - -const parseAuthCode = (url: string) => { - const queryParams = new URLSearchParams(url); - return queryParams.get('access_token'); -}; - -const DropboxPage: NextPage = () => { - const { t } = useTranslation(); - - useEffect(() => { - const code = parseAuthCode(window.location.hash.replace('#', '')); - window.location.hash = ''; - opener = window.opener; - if (window.parent != window.top) { - opener = opener || window.parent; - } - - if (opener) { - opener.postMessage({ code }, window.location.origin); - } - window.close(); - }, []); - - return <>{t('Getting auth code...')}</>; -}; - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -(DropboxPage as any).skipDuplicateTabCheck = true; - -// eslint-disable-next-line @typescript-eslint/no-explicit-any -(DropboxPage as any).skipProviders = true; - -export default DropboxPage; diff --git a/src/pages/join/join.module.scss b/src/pages/join/join.module.scss deleted file mode 100644 index f65754fad4b2f919dd951a63078217adc184fd21..0000000000000000000000000000000000000000 --- a/src/pages/join/join.module.scss +++ /dev/null @@ -1,18 +0,0 @@ -.passwordWrapper { - display: flex; - flex-direction: column; - align-items: center; - & > div, - & > p, - .channelCredentials { - width: 100%; - max-width: 534px; - } - - .button { - color: black; - &:disabled:hover { - cursor: not-allowed; - } - } -} diff --git a/src/quill/EmojiBlot.ts b/src/quill/EmojiBlot.ts index f4c5cd645603c7e45e868f5032d247824df1a51b..1113cad5ed43c5cb183fc15e4cd39b032e047f46 100644 --- a/src/quill/EmojiBlot.ts +++ b/src/quill/EmojiBlot.ts @@ -1,16 +1,21 @@ +import { EmbedBlot } from 'parchment'; import Quill from 'quill'; const Embed = Quill.import('blots/embed'); -class EmojiBlot extends Embed { +class EmojiBlot extends EmbedBlot { + static blotName = 'emoji'; + static tagName = 'span'; + static className = 'emoji'; + static create(value: string) { - const node = super.create(); - node.classList.add('emoji'); - node.innerText = value; + const node = super.create(value); + node.textContent = value; return node; } -} -EmojiBlot.blotName = 'emoji'; -EmojiBlot.tagName = 'span'; + static value(node: HTMLElement) { + return node.textContent; + } +} export default EmojiBlot; diff --git a/src/quill/ShortNameEmoji.ts b/src/quill/ShortNameEmoji.ts index 6ff3b86560bd4915132e48e7e29ff3d9575739bb..4ec6c93fc923c3e7f42f3dc2bbbf931b476088a2 100644 --- a/src/quill/ShortNameEmoji.ts +++ b/src/quill/ShortNameEmoji.ts @@ -1,7 +1,7 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import Quill, { DeltaStatic, RangeStatic, Sources } from 'quill'; +import Quill from 'quill'; import Fuse from 'fuse.js'; import emojiData, { EmojiMartData } from '@emoji-mart/data'; +import { Range } from 'quill'; const emojiMap = emojiData as EmojiMartData; const allEmojiKeys = Object.keys(emojiMap.emojis); @@ -13,14 +13,27 @@ const TRIGGER_CHAR = ':'; const MATCHING_CHARS = /:[a-zA-Z0-9_+]*:/dg; const MIN_MATCH_LENGTH = 1; +interface ShortNameEmojiOptions { + fuse?: Fuse.IFuseOptions<any>; + source?: (searchTerm: string) => any[]; + onOpen?: () => void; + onClose?: (value: string | null) => void; + container?: HTMLElement; +} + class ShortNameEmoji extends Module { container: HTMLUListElement; - - quill: Quill & { container?: any }; - - fuse: Fuse<string>; - - constructor(quill: Quill, options: any) { + quill: Quill; + options: ShortNameEmojiOptions; + fuse: Fuse<any>; + private open: boolean = false; + private triggerIndex: number | null = null; + private focusedButton: number | null = null; + private query: string = ''; + private buttons: HTMLElement[] = []; + private isWhiteSpace: (ch: string) => boolean; + + constructor(quill: Quill, options: ShortNameEmojiOptions = {}) { super(quill, options); this.fuse = new Fuse(allEmojiKeys, { @@ -40,6 +53,7 @@ class ShortNameEmoji extends Module { quill.on('text-change', this.onTextChange.bind(this)); + this.options = options; this.open = false; this.triggerIndex = null; this.focusedButton = null; @@ -53,7 +67,7 @@ class ShortNameEmoji extends Module { }; } - onTextChange(delta: DeltaStatic, oldDelta: DeltaStatic, source: Sources) { + onTextChange(delta: unknown, oldDelta: unknown, source: string) { if (source === 'user') { this.onSomethingChange(); } @@ -127,11 +141,16 @@ class ShortNameEmoji extends Module { } } - triggerPicker(range: RangeStatic) { + triggerPicker(range: Range) { if (this.open) return true; const triggerBounds = this.quill.getBounds(range.index); + if (!triggerBounds) { + console.warn('No trigger bounds found'); + return; + } + const paletteMaxPos = triggerBounds.left + 250; if (paletteMaxPos > this.quill.container.offsetWidth) { this.container.style.left = triggerBounds.left - 250 + 'px'; @@ -142,8 +161,8 @@ class ShortNameEmoji extends Module { this.container.style.bottom = triggerBounds.top + triggerBounds.height + 'px'; this.open = true; - if (this.onOpen) { - this.onOpen(); + if (this.options.onOpen) { + this.options.onOpen(); } } @@ -158,6 +177,16 @@ class ShortNameEmoji extends Module { update() { const sel = this.quill.getSelection()?.index ?? 0; + + if (!sel) { + console.warn('No selection found'); + return; + } + if (!this.triggerIndex) { + console.warn('No trigger index found'); + return; + } + if (this.triggerIndex >= sel) { return this.close(null); } @@ -291,14 +320,18 @@ class ShortNameEmoji extends Module { if (value) { const index = this.triggerIndex; + if (!index) { + console.warn('No trigger index found'); + return; + } this.quill.deleteText(index, this.query.length + 1 + trailingDelete, 'user'); this.quill.insertEmbed(index, 'emoji', value, 'user'); setTimeout(() => this.quill.setSelection(index + value.length), 0); } this.quill.focus(); this.open = false; - if (this.onClose) { - this.onClose(value); + if (this.options.onClose) { + this.options.onClose(value); } } } diff --git a/src/router.tsx b/src/router.tsx new file mode 100644 index 0000000000000000000000000000000000000000..b2886b4d080ccf73924cbc8433c8e7c3ed8d1625 --- /dev/null +++ b/src/router.tsx @@ -0,0 +1,21 @@ +import { createBrowserRouter } from 'react-router-dom'; +import Home from './routes/Home'; +import Join from './routes/Join'; +import App from './App'; + +export const router = createBrowserRouter([ + { + path: '/', + element: <App />, + children: [ + { + index: true, + element: <Home /> + }, + { + path: 'join', + element: <Join /> + } + ] + } +]); diff --git a/src/pages/index.tsx b/src/routes/Home.tsx similarity index 65% rename from src/pages/index.tsx rename to src/routes/Home.tsx index aa6c8e7896a6ea98f753cd1eff5491eef29b893b..cb8680328aed312d8d9e50fe1bc275b61bebf452 100644 --- a/src/pages/index.tsx +++ b/src/routes/Home.tsx @@ -1,21 +1,18 @@ -import { NextPage } from 'next'; import { useEffect } from 'react'; import Cookies from 'js-cookie'; - -import { DefaultLayout } from 'src/layouts'; -import { ChannelChat } from 'src/components/common'; - +import { DefaultLayout } from '../layouts'; +import { ChannelChat } from '../components/common'; import { useUI } from '@contexts/ui-context'; -import usePrevious from 'src/hooks/usePrevious'; -import { useAppSelector } from 'src/store/hooks'; -import * as channels from 'src/store/channels'; -import { currentMessages as currentMessagesSelector } from 'src/store/selectors'; +import usePrevious from '../hooks/usePrevious'; +import { useAppSelector } from '../store/hooks'; +import * as channels from '../store/channels'; +import { currentMessages as currentMessagesSelector } from '../store/selectors'; const removeAuthCookie = () => { Cookies.remove('userAuthenticated', { path: '/' }); }; -const Home: NextPage = () => { +const Home = () => { const { closeModal } = useUI(); useEffect(() => { @@ -41,6 +38,11 @@ const Home: NextPage = () => { return <ChannelChat messages={currentMessages} />; }; -export default Home; -// eslint-disable-next-line @typescript-eslint/no-explicit-any -(Home as any).Layout = DefaultLayout; +// Wrap with layout +const HomeWithLayout = () => ( + <DefaultLayout> + <Home /> + </DefaultLayout> +); + +export default HomeWithLayout; diff --git a/src/pages/join/index.tsx b/src/routes/Join.tsx similarity index 69% rename from src/pages/join/index.tsx rename to src/routes/Join.tsx index 321872c4791d29d19e2ff4ac9994560e174439ea..7bfa8a0cb2b695ac8ed915cfb38396e594dc10af 100644 --- a/src/pages/join/index.tsx +++ b/src/routes/Join.tsx @@ -1,27 +1,25 @@ -import { type ChannelJSON, PrivacyLevel } from '@types'; - -import { NextPage } from 'next'; -import { useCallback, useEffect, useMemo, useState } from 'react'; -import { useRouter } from 'next/router'; +import { type ChannelJSON, PrivacyLevel } from '../types'; +import { useEffect, useMemo, useState } from 'react'; +import { useLocation, useNavigate } from 'react-router-dom'; import cn from 'classnames'; import { useTranslation } from 'react-i18next'; import { useNetworkClient } from 'src/contexts/network-client-context'; import { useUtils } from 'src/contexts/utils-context'; -import { WarningComponent } from 'src/pages/_app'; +import WarningComponent from 'src/components/common/WarningComponent'; import JoinChannelView from 'src/components/views/JoinChannel'; import { Button } from 'src/components/common'; import { Spinner } from 'src/components/common'; import { decoder } from 'src/utils'; +import { channelDecoder } from 'src/utils/decoders'; +import { useAuthentication } from 'src/contexts/authentication-context'; -import s from './join.module.scss'; -import CheckboxToggle from '@components/common/CheckboxToggle'; -import { channelDecoder } from '@utils/decoders'; -import { useAuthentication } from '@contexts/authentication-context'; +import CheckboxToggle from 'src/components/common/CheckboxToggle'; -const Join: NextPage = () => { +const Join = () => { const { t } = useTranslation(); - const router = useRouter(); + const navigate = useNavigate(); + const location = useLocation(); const [isUserAuthenticated, setIsUserAuthenticated] = useState< boolean | 'loading' | 'no-response' >('loading'); @@ -63,19 +61,19 @@ const Join: NextPage = () => { }, [authChannel, instanceId]); useEffect(() => { - if (window.location.search.length) { + if (location.search.length) { setWithLink(true); } - }, []); + }, [location.search]); useEffect(() => { if (channelType === 0 || channelType === 2) { if (isUserAuthenticated === 'no-response') { - const params = Object.fromEntries(new URLSearchParams(location.search)); - router.push({ pathname: '/', query: params }); + const params = new URLSearchParams(location.search); + navigate({ pathname: '/', search: params.toString() }); } } - }, [channelType, isUserAuthenticated, router]); + }, [channelType, isUserAuthenticated, navigate, location.search]); useEffect(() => { if (utilsLoaded && isUserAuthenticated !== 'loading' && isUserAuthenticated !== 'no-response') { @@ -101,7 +99,7 @@ const Join: NextPage = () => { } }, [broadcastChannel, channelType, utils]); - const joinPrivateChannel = useCallback(() => { + const joinPrivateChannel = () => { if (password) { try { const prettyPrinted = utils.DecodePrivateURL(window.location.href, password); @@ -114,9 +112,9 @@ const Join: NextPage = () => { setError('Invalid passphrase'); } } - }, [password, utils]); + }; - const attemptJoinChannel = useCallback(() => { + const attemptJoinChannel = () => { if (channelPrettyPrint && broadcastChannel) { broadcastChannel.postMessage({ type: 'JOIN_CHANNEL', @@ -124,7 +122,7 @@ const Join: NextPage = () => { dmsEnabled }); } - }, [broadcastChannel, channelPrettyPrint, dmsEnabled]); + }; if (isLoading) { return ( @@ -176,42 +174,48 @@ const Join: NextPage = () => { /> )} {!channelInfoJson && window?.location?.href && channelType === 2 && ( - <div className={s.passwordWrapper}> - <h2 className='mt-9 mb-6'>{'This Haven Chat requires a passphrase to join'}</h2> - <input - className='mt-3 mb-4' - name='' - type='password' - onKeyDown={(e) => { - if (e.key === 'Enter') { - joinPrivateChannel(); - } - }} - placeholder={t('Enter passphrase')} - value={password} - onChange={(e) => { - setPassword(e.target.value); - }} - /> - - <div className='flex justify-between mt-8 w-full px-3'> - <h3 className='headline--sm'>{t('Enable Direct Messages')}</h3> - <CheckboxToggle checked={dmsEnabled} onChange={() => setDmsEnabled((e) => !e)} /> - </div> - {error && ( - <div className={'text text--xs mt-2 text-center'} style={{ color: 'var(--red)' }}> - {error} + <div className='flex flex-col items-center'> + <h2 className='mt-9 mb-6'>{t('This Haven Chat requires a passphrase to join')}</h2> + <div className='w-full max-w-[534px]'> + <input + className='mt-3 mb-4' + name='' + type='password' + onKeyDown={(e) => { + if (e.key === 'Enter') { + joinPrivateChannel(); + } + }} + placeholder={t('Enter passphrase')} + value={password} + onChange={(e) => { + setPassword(e.target.value); + }} + /> + + <div className='flex justify-between mt-8 px-3'> + <h3 className='headline--sm'>{t('Enable Direct Messages')}</h3> + <CheckboxToggle checked={dmsEnabled} onChange={() => setDmsEnabled((e) => !e)} /> + </div> + {error && ( + <div className='text text--xs mt-2 text-center text-[var(--red)]'>{error}</div> + )} + <div className='flex justify-center'> + <Button + className='mb-7 mt-8 text-black disabled:cursor-not-allowed' + onClick={joinPrivateChannel} + > + {t('Confirm')} + </Button> </div> - )} - <Button className={cn('mb-7 mt-8 mr-4', s.button)} onClick={joinPrivateChannel}> - {t('Confirm')} - </Button> + </div> </div> )} </> ); }; +// Skip duplicate tab check for join route +Join.skipDuplicateTabCheck = true; + export default Join; -// eslint-disable-next-line @typescript-eslint/no-explicit-any -(Join as any).skipDuplicateTabCheck = true; diff --git a/src/store/app/index.ts b/src/store/app/index.ts index f226bcaefd94b1b6dee8bdfaf069e58150ea7782..ac88100e8fd4c7439ce607169e30aebc8287021f 100644 --- a/src/store/app/index.ts +++ b/src/store/app/index.ts @@ -4,7 +4,7 @@ import type { ConversationId } from '../dms/types'; import type { Message } from '../messages/types'; import { createSlice, PayloadAction } from '@reduxjs/toolkit'; -import { MessageType } from '@types'; +import { MessageType } from '../../types'; const initialState: AppState = { selectedChannelIdOrConversationId: null, diff --git a/src/store/channels/index.ts b/src/store/channels/index.ts index 9e07fc39c79a8c54df403dd809864b1c27e053b6..827c88362cbdc465c76d0a5e0c927780ad990cc9 100644 --- a/src/store/channels/index.ts +++ b/src/store/channels/index.ts @@ -1,7 +1,7 @@ import type { Channel, ChannelId, ChannelsState } from './types'; import { createSlice, PayloadAction } from '@reduxjs/toolkit'; -import { ChannelNotificationLevel, NotificationStatus, UserMutedEvent } from '@types'; +import { ChannelNotificationLevel, NotificationStatus, UserMutedEvent } from 'src/types'; import { pickBy, omit, uniqBy, uniq } from 'lodash'; const initialState: ChannelsState = { diff --git a/src/store/channels/selectors.ts b/src/store/channels/selectors.ts index 377540b7eaad59707454a68c0e7415ee64c3b226..ea30940c31855dfce8e97027d523df1d7da74089 100644 --- a/src/store/channels/selectors.ts +++ b/src/store/channels/selectors.ts @@ -3,7 +3,7 @@ import { createSelector } from '@reduxjs/toolkit'; import { channelsSearch } from '../app/selectors'; import { sortBy } from 'lodash'; import { ChannelId } from './types'; -import { NotificationStatus } from '@types'; +import { NotificationStatus } from 'src/types'; export const channels = (state: RootState) => state.channels.sortedChannels; diff --git a/src/store/channels/types.ts b/src/store/channels/types.ts index 4e99a68c0d89d6724a23a1e0f7f9b399cfb6d3ce..b890e8cade8ea0345b75b5c35a26ddfa55fe23b9 100644 --- a/src/store/channels/types.ts +++ b/src/store/channels/types.ts @@ -1,9 +1,6 @@ import { ChannelNotificationLevel, NotificationStatus } from 'src/types'; - -export enum PrivacyLevel { - Public = 0, - Secret = 2 -} +import { PrivacyLevel } from 'src/types'; +export { PrivacyLevel }; export type Channel = { name: string; diff --git a/src/store/dms/index.ts b/src/store/dms/index.ts index 9becf3603fdb2d0ee606a89e7c7b959fae4f9c38..5933447a4942b6ada55dc6a42b82139793093192 100644 --- a/src/store/dms/index.ts +++ b/src/store/dms/index.ts @@ -4,7 +4,7 @@ import { createSlice, PayloadAction } from '@reduxjs/toolkit'; import { Message } from '../messages/types'; import { reactionsReducer } from '../utils'; -import { DMNotificationLevel, MessageType } from '@types'; +import { DMNotificationLevel, MessageType } from 'src/types'; import { uniq } from 'lodash'; const initialState: DMState = { diff --git a/src/store/hooks.ts b/src/store/hooks.ts index 0a1731e7331d91f3245be3ba8c29fb6e83e2c4ce..81bfc17684390c4d4959054428c11a622b04ada7 100644 --- a/src/store/hooks.ts +++ b/src/store/hooks.ts @@ -1,11 +1,5 @@ -import type { RootState } from 'src/store/types'; -import type { AnyAction, Dispatch, CombinedState, ThunkDispatch } from '@reduxjs/toolkit'; - import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux'; +import type { RootState, AppDispatch } from './index'; -type AppDispatch = ThunkDispatch<CombinedState<RootState>, undefined, AnyAction> & - Dispatch<AnyAction>; - -// Use throughout your app instead of plain `useDispatch` and `useSelector` -export const useAppDispatch: () => AppDispatch = useDispatch; +export const useAppDispatch = () => useDispatch<AppDispatch>(); export const useAppSelector: TypedUseSelectorHook<RootState> = useSelector; diff --git a/src/store/index.ts b/src/store/index.ts index 57c27f1d9c337e52b2d9b902fadfb1f457373126..bbced1f185405814b4a98023ffe090ee1a1afd64 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -1,24 +1,21 @@ -import type { RootState } from 'src/store/types'; -import { compose, configureStore, combineReducers } from '@reduxjs/toolkit'; -import persistState from 'redux-localstorage'; - -import app from './app'; -import channels from './channels'; -import dms from './dms'; -import identity from './identity'; -import messages from './messages'; - -const enhancer = compose(persistState(['app'])); +import { configureStore } from '@reduxjs/toolkit'; +import channelsReducer from './channels'; +import messagesReducer from './messages'; +import identityReducer from './identity'; +import dmsReducer from './dms'; +import appReducer from './app'; const store = configureStore({ - enhancers: typeof window === 'undefined' ? [] : [enhancer], - reducer: combineReducers<RootState>({ - app, - channels, - dms, - identity, - messages - }) + reducer: { + channels: channelsReducer, + messages: messagesReducer, + identity: identityReducer, + dms: dmsReducer, + app: appReducer + } }); +export type RootState = ReturnType<typeof store.getState>; +export type AppDispatch = typeof store.dispatch; + export default store; diff --git a/src/store/messages/index.ts b/src/store/messages/index.ts index 8016e3a5bbe4695065269d3fe095a9c058336f4f..bdc66249e9ab39a85ec4500b31a26289e54f3f62 100644 --- a/src/store/messages/index.ts +++ b/src/store/messages/index.ts @@ -2,7 +2,7 @@ import type { Contributor, Message, MessagesState } from './types'; import { createSlice, PayloadAction } from '@reduxjs/toolkit'; import { pick, omit, uniq } from 'lodash'; import { byTimestamp, deleteReactionReducer, reactionsReducer } from '../utils'; -import { MessageId, MessageType } from '@types'; +import { MessageId, MessageType } from '../../types'; const initialState: MessagesState = { reactions: {}, diff --git a/src/store/types.ts b/src/store/types.ts index 02b33a96b4efac586ccd040eea021f3f91697950..eb5483de639fa11c456439172316f23ff98520b2 100644 --- a/src/store/types.ts +++ b/src/store/types.ts @@ -1,6 +1,5 @@ -import { MessageStatus } from '@types'; +import { MessageStatus } from 'src/types'; -/* eslint-disable @typescript-eslint/no-empty-interface */ export interface RootState { // empty on purpose so that the slices extend the interface } diff --git a/src/store/utils.ts b/src/store/utils.ts index 387f9b932b37a66fc5cca45e66a55edb6ece090f..c2c57844d260c21a454a64df6a8d358f3165561e 100644 --- a/src/store/utils.ts +++ b/src/store/utils.ts @@ -1,9 +1,9 @@ -import { Message, MessageId } from '@types'; +import { Message, MessageId } from '../types'; import type { EmojiReactions, ReactionInfo } from 'src/store/types'; import { omit, uniqBy } from 'lodash'; -import { MessageType } from '@types'; +import { MessageType } from '../types'; export const byTimestamp = <T extends { timestamp: string }>(a: T, b: T) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime(); diff --git a/src/types/collective.ts b/src/types/collective.ts index f3671b09740639627803f11840f8ce2558a07ad2..088e12a7af176024c44c73a996d5976fe0c1ff18 100644 --- a/src/types/collective.ts +++ b/src/types/collective.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-console */ import { encoder } from '@utils/index'; import { AccountSyncService } from 'src/hooks/useAccountSync'; diff --git a/src/types/emitter.ts b/src/types/emitter.ts index 182449b13fc5de1b3e236192e21f7c6e02d1511f..d6807e84e80671cad111e081506d31c1980d9427 100644 --- a/src/types/emitter.ts +++ b/src/types/emitter.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ export type EventMap = { [key: string]: (...args: any[]) => void; }; diff --git a/src/types/events.ts b/src/types/events.ts index 8c97e1cd507765636e9969342a9749320176a0af..dc1c23957bbbc4b909d7155595da64c492ac8d1c 100644 --- a/src/types/events.ts +++ b/src/types/events.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ import type { ChannelId } from 'src/store/channels/types'; import type { Message } from 'src/store/messages/types'; import type { MessageType } from './db'; diff --git a/src/types/index.ts b/src/types/index.ts index 906cfedaa7c567a75efe7a4ff59ce7f9b696056d..bd6cd4cf12214051a70328166099e0dac7c86567 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -1,9 +1,8 @@ -import type { ReactNode } from 'react'; import { RemoteKV } from './collective'; import { DMNotificationLevel } from './events'; export type WithChildren = { - children?: ReactNode; + children?: React.ReactNode; }; type HealthCallback = { Callback: (healthy: boolean) => void }; @@ -131,6 +130,38 @@ export type RawCipher = { Decrypt: (plaintext: string) => Uint8Array; }; +export type MuteUserAction = 'mute' | 'mute+delete'; + +export enum PrivacyLevel { + Public = 0, + Secret = 2 +} + +export enum MessageStatus { + Unsent = 0, + Sent = 1, + Delivered = 2, + Failed = 3 +} + +export enum ChannelNotificationLevel { + NotifyNone = 0, + NotifyPing = 1, + NotifyAll = 2 +} + +export enum NotificationStatus { + Mute = 0, + WhenOpen = 1, + All = 2 +} + +export type UserMutedEvent = { + channelId: string; + pubkey: string; + unmute: boolean; +}; + export * from './collective'; export * from './db'; export * from './emitter'; diff --git a/src/utils/compression.ts b/src/utils/compression.ts new file mode 100644 index 0000000000000000000000000000000000000000..4744759af07c8a01653c5c771614bdf07d138748 --- /dev/null +++ b/src/utils/compression.ts @@ -0,0 +1,42 @@ +import pako from 'pako'; +import DOMPurify from 'dompurify'; +import { Buffer } from 'buffer'; + +export const inflate = (content: string) => { + let inflated: string; + try { + const uint8Array = new Uint8Array(Buffer.from(content, 'base64')); + inflated = new TextDecoder().decode(pako.inflate(uint8Array)); + } catch (e) { + console.error(`Couldn't decode message "${content}". Falling back to plaintext.`, e); + inflated = content; + } + return sanitize(inflated); +}; + +export const deflate = (str: string): string => { + const compressed = pako.deflate(str); + return Buffer.from(compressed).toString('base64'); +}; + +const sanitize = (markup: string) => + DOMPurify.sanitize(markup, { + ALLOWED_TAGS: [ + 'blockquote', + 'p', + 'a', + 'br', + 'code', + 'ol', + 'ul', + 'li', + 'pre', + 'i', + 'strong', + 'b', + 'em', + 'span', + 's' + ], + ALLOWED_ATTR: ['target', 'href', 'rel', 'class', 'style'] + }); diff --git a/src/utils/date.ts b/src/utils/date.ts new file mode 100644 index 0000000000000000000000000000000000000000..819dbf3887092b5169380849e190877e3b3c1060 --- /dev/null +++ b/src/utils/date.ts @@ -0,0 +1,18 @@ +import dayjs from 'dayjs'; + +export const formatTimeAgo = (date: Date | number): string => { + return dayjs(date).format('HH:mm'); +}; + +export const formatDate = (key: string, timestamp?: string): string => { + const date = dayjs(key); + const today = dayjs(); + + if (date.isSame(today, 'day')) { + return 'Today'; + } + if (date.isSame(today.subtract(1, 'day'), 'day')) { + return 'Yesterday'; + } + return date.format('MMMM D, YYYY'); +}; diff --git a/src/utils/decoders.ts b/src/utils/decoders.ts index 75c7766ac716fa94e8613af90b4333e2afe9d410..59d75aa1fa944c97b55024b4f0d59ca9f7dc8a27 100644 --- a/src/utils/decoders.ts +++ b/src/utils/decoders.ts @@ -26,6 +26,11 @@ import { import { KVEntry } from 'src/types/collective'; import { Err, JsonDecoder } from 'ts.data.json'; import { decoder as uintDecoder } from './index'; +import { + ChannelNotificationLevel as EventsChannelNotificationLevel, + NotificationState as EventsNotificationState, + NotificationStatus as EventsNotificationStatus +} from 'src/types/events'; const attemptParse = (object: unknown) => { let parsed = object; @@ -209,15 +214,15 @@ export const nicknameUpdatedEventDecoder = makeDecoder( ) ); -export const notificationLevelDecoder = JsonDecoder.enumeration<ChannelNotificationLevel>( - ChannelNotificationLevel, +export const notificationLevelDecoder = JsonDecoder.enumeration<EventsChannelNotificationLevel>( + EventsChannelNotificationLevel, 'NotificationLevelDecoder' ); -export const notificationStatusDecoder = JsonDecoder.enumeration<NotificationStatus>( - NotificationStatus, +export const notificationStatusDecoder = JsonDecoder.enumeration<EventsNotificationStatus>( + EventsNotificationStatus, 'NotificationStatusDecoder' ); -const notificationStateDecoder = JsonDecoder.object<NotificationState>( +const notificationStateDecoder = JsonDecoder.object<EventsNotificationState>( { channelId: JsonDecoder.string, level: notificationLevelDecoder, @@ -232,7 +237,7 @@ const notificationStateDecoder = JsonDecoder.object<NotificationState>( export const notificationUpdateEventDecoder = makeDecoder( JsonDecoder.object<NotificationUpdateEvent>( { - changedNotificationStates: JsonDecoder.array<NotificationState>( + changedNotificationStates: JsonDecoder.array<EventsNotificationState>( notificationStateDecoder, 'ChangedNotificationStatesDecoder' ), diff --git a/src/utils/index.ts b/src/utils/index.ts index 9c2f1f31e7cff122611537f0fdeae935f5794221..c3e64154b04cff826a932de35646e479f926a056 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -1,7 +1,4 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import { deflateSync, inflateSync } from 'zlib'; -import DOMPurify from 'dompurify'; -import { TypedEventEmitter } from '@types'; +import { TypedEventEmitter } from 'src/types'; import { useEffect, useState } from 'react'; import delay from 'delay'; @@ -40,43 +37,6 @@ export const exportDataToFile = (data: Uint8Array) => { export const byEntryTimestamp = (x: [string, unknown], y: [string, unknown]) => new Date(x[0]).getTime() - new Date(y[0]).getTime(); -const sanitize = (markup: string) => - DOMPurify.sanitize(markup, { - ALLOWED_TAGS: [ - 'blockquote', - 'p', - 'a', - 'br', - 'code', - 'ol', - 'ul', - 'li', - 'pre', - 'i', - 'strong', - 'b', - 'em', - 'span', - 's' - ], - ALLOWED_ATTR: ['target', 'href', 'rel', 'class', 'style'] - }); - -export const inflate = (content: string) => { - let inflated: string; - try { - inflated = inflateSync(Buffer.from(content, 'base64')).toString(); - } catch (e) { - console.error(`Couldn\'t decode message "${content}". Falling back to plaintext.`, e); - inflated = content; - } - - return sanitize(inflated); -}; - -export const deflate = (content: string) => deflateSync(content).toString('base64'); - -// eslint-disable-next-line @typescript-eslint/no-explicit-any export const makeListenerHook = <T extends Record<string | number, any>>(bus: TypedEventEmitter<T>) => <K extends keyof T>(key: K, listener: T[K]) => { @@ -120,14 +80,14 @@ export const makeEventAwaiter = let listener: AnyFunc; let resolved = false; const promise = new Promise<Parameters<T[K]>>((resolve) => { - listener = (...args) => { + listener = (...args: Parameters<T[K]>) => { const result = predicate(...args); if (result) { resolved = true; - resolve(args); + resolve(args as Parameters<T[K]>); } }; - bus.addListener(evt, listener as any); + bus.addListener(evt, listener as T[K]); }); return Promise.race([ diff --git a/tailwind.config.js b/tailwind.config.js index 69ad3d096c74c1985e59cf1acf55cbb7866f31c2..72d6dc2922288370fd0af5dd165821ca499f8d9a 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -1,6 +1,8 @@ /** @type {import('tailwindcss').Config} */ module.exports = { - content: ['./src/**/*.{js,ts,jsx,tsx}'], + content: [ + "./src/**/*.{js,jsx,ts,tsx}", + ], theme: { colors: { primary: 'var(--primary)', @@ -35,6 +37,18 @@ module.exports = { lg: '1280px', xl: '1280px', '2xl': '1560px' + }, + keyframes: { + draw: { + '0%, 66%, 100%': { + fill: 'rgb(96, 165, 250)', // blue-400 lighter + transform: 'translate(0, 0)' + }, + '33%': { + fill: 'rgb(59, 130, 246)', // blue-500 darker + transform: 'translate(-1px, -1px)' + } + } } } }, diff --git a/tsconfig.json b/tsconfig.json index cc6c4ce50afe95c1a119c87345005f712fc27ebb..9ad0a2630ebb602a294fabcceca4ecb7f01dc4ac 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -17,16 +17,12 @@ "incremental": true, "allowSyntheticDefaultImports": true, "paths": { - "@assets/*": ["src/assets/*"], - "@utils/*": ["src/utils/*"], - "@layouts": ["src/layouts"], - "@layouts/*": ["src/layouts/*"], - "@components/*": ["src/components/*"], + "@/*": ["src/*"], + "src/*": ["src/*"], "@contexts/*": ["src/contexts/*"], - "@types": ["src/types"], - "@utils": ["src/utils/index"], - "@utils/hooks/*": ["src/utils/hooks/*"], - "@sdk/*": ["sdk-utils/*"] + "@components/*": ["src/components/*"], + "@assets/*": ["src/assets/*"], + "@utils/*": ["src/utils/*"] } }, "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", "src/quill/constants.js"], diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000000000000000000000000000000000000..c6418dc7deaa28448c6939b70f747fa84992ab83 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,118 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; +import path from 'path'; +import eslint from 'vite-plugin-eslint'; +import { version } from './package.json'; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [ + react(), + eslint({ + include: ['src/**/*.ts', 'src/**/*.tsx', 'src/**/*.js', 'src/**/*.jsx'], + exclude: ['node_modules/**', 'dist/**'], + failOnError: false, + failOnWarning: false, + cache: true, + lintOnStart: true, + overrideConfigFile: 'eslint.config.js' + }) + ], + build: { + chunkSizeWarningLimit: 5000, + minify: false, + commonjsOptions: { + include: [/node_modules/], + transformMixedEsModules: true, + requireReturnsDefault: 'auto', + strictRequires: true + }, + rollupOptions: { + output: { + format: 'es', + manualChunks: { + // Core vendor dependencies + vendor: ['react', 'react-dom', 'react-router-dom'], + + // Editor related chunks + editor: ['quill', 'quill-mention', 'quill-auto-detect-url'], + + 'editor-ui': ['./src/components/common/ChannelChat/UserTextArea/UserTextArea.tsx'], + + // Chat UI components + 'chat-ui': [ + './src/components/common/ChannelChat/MessageContainer/index.tsx', + './src/components/common/ChannelChat/ChatMessage/ChatMessage.tsx', + './src/components/common/ChannelChat/MessagesContainer/index.tsx' + ], + + // Channel management components + 'channel-ui': [ + './src/components/common/ChannelHeader/index.tsx', + './src/components/common/ChannelBadges.tsx', + './src/components/common/LeftSideBar/LeftSideBar.tsx' + ], + + // Common UI components + 'common-ui': [ + './src/components/common/Button/index.tsx', + './src/components/common/Badge.tsx', + './src/components/common/Dropdown/index.tsx' + ], + + // Modal components + modals: [ + './src/components/modals/Modal.tsx', + './src/components/modals/ModalTitle.tsx', + './src/components/modals/UpdatesModal.tsx' + ], + + // Emoji and reactions + emoji: [ + './src/components/common/EmojiPortal.tsx', + './src/components/common/ChannelChat/ChatReactions/index.tsx' + ] + } + } + }, + modulePreload: { + polyfill: true + }, + target: ['es2015', 'edge88', 'firefox78', 'chrome87', 'safari13'] + }, + server: { + port: 3000, + open: true + }, + resolve: { + alias: { + '@': path.resolve(__dirname, './src'), + src: path.resolve(__dirname, './src'), + '@contexts': path.resolve(__dirname, './src/contexts'), + '@components': path.resolve(__dirname, './src/components'), + '@assets': path.resolve(__dirname, './src/assets'), + '@utils': path.resolve(__dirname, './src/utils'), + buffer: 'buffer' + } + }, + define: { + 'import.meta.env.APP_VERSION': JSON.stringify(version), + global: 'window' + }, + esbuild: { + target: 'es2015', + supported: { + 'async-await': true + } + }, + optimizeDeps: { + include: ['buffer', 'use-sound', 'howler'], + exclude: [], + esbuildOptions: { + target: 'es2015', + supported: { + 'async-await': true + } + } + } +});