From 5a2ef3d923da5486dbda03712b2a1da75d9526b2 Mon Sep 17 00:00:00 2001 From: Ravindra Singh Rathor Date: Fri, 9 Aug 2024 10:01:13 +0530 Subject: [PATCH] feat(screenshare-focused-custom-addons-ui): added screenshare focused UI with custom addon code --- .../.gitignore | 23 + .../README.md | 23 + .../index.html | 12 + .../package-lock.json | 3059 +++++++++++++++++ .../package.json | 31 + .../postcss.config.js | 6 + .../src/App.tsx | 111 + .../src/components/Dialog.tsx | 33 + .../src/components/EffectsManager.tsx | 166 + .../src/components/ReactionsManager.tsx | 62 + .../src/components/audio-preview.tsx | 140 + .../src/components/custom-dyte-grid.css | 22 + .../src/components/custom-dyte-grid.tsx | 194 ++ .../src/components/custom-dyte-meeting.tsx | 37 + .../components/custom-participant-tile.tsx | 51 + .../src/components/in-meeting.tsx | 73 + .../src/components/media-preview-modal.tsx | 60 + .../src/components/meeting-control-bar.tsx | 98 + .../src/components/meeting-header.tsx | 37 + .../src/components/meeting-loading.tsx | 11 + .../src/components/meeting-over.tsx | 18 + .../src/components/meeting-sidebar.tsx | 76 + .../src/components/setup-screen.tsx | 192 ++ .../src/components/video-preview.tsx | 98 + .../src/components/waiting-room.tsx | 20 + .../src/dyte-state-listeners.tsx | 108 + .../src/global.css | 58 + .../src/index.css | 11 + .../src/lib/graceful-storage.ts | 21 + .../src/lib/store.ts | 55 + .../src/main.tsx | 9 + .../src/types.tsx | 8 + .../src/utils.ts | 21 + .../src/vite-env.d.ts | 1 + .../tailwind.config.js | 8 + .../tsconfig.json | 21 + .../tsconfig.node.json | 9 + .../vite.config.ts | 8 + 38 files changed, 4991 insertions(+) create mode 100644 samples/screenshare-focused-ui-with-custom-addons/.gitignore create mode 100644 samples/screenshare-focused-ui-with-custom-addons/README.md create mode 100644 samples/screenshare-focused-ui-with-custom-addons/index.html create mode 100644 samples/screenshare-focused-ui-with-custom-addons/package-lock.json create mode 100644 samples/screenshare-focused-ui-with-custom-addons/package.json create mode 100644 samples/screenshare-focused-ui-with-custom-addons/postcss.config.js create mode 100644 samples/screenshare-focused-ui-with-custom-addons/src/App.tsx create mode 100644 samples/screenshare-focused-ui-with-custom-addons/src/components/Dialog.tsx create mode 100644 samples/screenshare-focused-ui-with-custom-addons/src/components/EffectsManager.tsx create mode 100644 samples/screenshare-focused-ui-with-custom-addons/src/components/ReactionsManager.tsx create mode 100644 samples/screenshare-focused-ui-with-custom-addons/src/components/audio-preview.tsx create mode 100644 samples/screenshare-focused-ui-with-custom-addons/src/components/custom-dyte-grid.css create mode 100644 samples/screenshare-focused-ui-with-custom-addons/src/components/custom-dyte-grid.tsx create mode 100644 samples/screenshare-focused-ui-with-custom-addons/src/components/custom-dyte-meeting.tsx create mode 100644 samples/screenshare-focused-ui-with-custom-addons/src/components/custom-participant-tile.tsx create mode 100644 samples/screenshare-focused-ui-with-custom-addons/src/components/in-meeting.tsx create mode 100644 samples/screenshare-focused-ui-with-custom-addons/src/components/media-preview-modal.tsx create mode 100644 samples/screenshare-focused-ui-with-custom-addons/src/components/meeting-control-bar.tsx create mode 100644 samples/screenshare-focused-ui-with-custom-addons/src/components/meeting-header.tsx create mode 100644 samples/screenshare-focused-ui-with-custom-addons/src/components/meeting-loading.tsx create mode 100644 samples/screenshare-focused-ui-with-custom-addons/src/components/meeting-over.tsx create mode 100644 samples/screenshare-focused-ui-with-custom-addons/src/components/meeting-sidebar.tsx create mode 100644 samples/screenshare-focused-ui-with-custom-addons/src/components/setup-screen.tsx create mode 100644 samples/screenshare-focused-ui-with-custom-addons/src/components/video-preview.tsx create mode 100644 samples/screenshare-focused-ui-with-custom-addons/src/components/waiting-room.tsx create mode 100644 samples/screenshare-focused-ui-with-custom-addons/src/dyte-state-listeners.tsx create mode 100644 samples/screenshare-focused-ui-with-custom-addons/src/global.css create mode 100644 samples/screenshare-focused-ui-with-custom-addons/src/index.css create mode 100644 samples/screenshare-focused-ui-with-custom-addons/src/lib/graceful-storage.ts create mode 100644 samples/screenshare-focused-ui-with-custom-addons/src/lib/store.ts create mode 100644 samples/screenshare-focused-ui-with-custom-addons/src/main.tsx create mode 100644 samples/screenshare-focused-ui-with-custom-addons/src/types.tsx create mode 100644 samples/screenshare-focused-ui-with-custom-addons/src/utils.ts create mode 100644 samples/screenshare-focused-ui-with-custom-addons/src/vite-env.d.ts create mode 100644 samples/screenshare-focused-ui-with-custom-addons/tailwind.config.js create mode 100644 samples/screenshare-focused-ui-with-custom-addons/tsconfig.json create mode 100644 samples/screenshare-focused-ui-with-custom-addons/tsconfig.node.json create mode 100644 samples/screenshare-focused-ui-with-custom-addons/vite.config.ts diff --git a/samples/screenshare-focused-ui-with-custom-addons/.gitignore b/samples/screenshare-focused-ui-with-custom-addons/.gitignore new file mode 100644 index 0000000..251ce6d --- /dev/null +++ b/samples/screenshare-focused-ui-with-custom-addons/.gitignore @@ -0,0 +1,23 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/samples/screenshare-focused-ui-with-custom-addons/README.md b/samples/screenshare-focused-ui-with-custom-addons/README.md new file mode 100644 index 0000000..a915192 --- /dev/null +++ b/samples/screenshare-focused-ui-with-custom-addons/README.md @@ -0,0 +1,23 @@ +# Screenshare focused UI with custom addons such as Hand raise, Reactions & video middleware + +Unlike traditional samples where devs are given a fixed UI, this sample let's you pick your own variant from a variety of variants for a component. + +For example, There are a few variants of [Setup Screen component file](./src/components/setup-screen.tsx). + +```tsx +export default SetupScreenPreBuilt; + +export default CustomSetupScreenWithPrebuiltMediaPreviewModal; + +export default CustomSetupScreenWithCustomMediaPreviewModal; +``` + +All you have to do, to pick a variant of your choice, is to comment out the undesired variants and only uncomment the one you want. Once you have made up your mind, you can copy paste the code to your application. + +## How to run? + +1. Run `npm install` in the current [folder](./) +2. Run `npm run dev` to start a server. See the port in the logs of this command. Default is 5173. +3. Open browser with the URL `http://localhost:5173/?authToken=PUT_PARTICIPANT_AUTH_TOKEN_HERE`. Change the port if needed. + +To learn more, refer to [the source code](./src/App.tsx) diff --git a/samples/screenshare-focused-ui-with-custom-addons/index.html b/samples/screenshare-focused-ui-with-custom-addons/index.html new file mode 100644 index 0000000..04465bd --- /dev/null +++ b/samples/screenshare-focused-ui-with-custom-addons/index.html @@ -0,0 +1,12 @@ + + + + + + Custom Meeting UI - Dyte UI Kit + + +
+ + + diff --git a/samples/screenshare-focused-ui-with-custom-addons/package-lock.json b/samples/screenshare-focused-ui-with-custom-addons/package-lock.json new file mode 100644 index 0000000..ec89cd8 --- /dev/null +++ b/samples/screenshare-focused-ui-with-custom-addons/package-lock.json @@ -0,0 +1,3059 @@ +{ + "name": "dyte-meeting-split", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "version": "0.0.0", + "dependencies": { + "@dytesdk/react-ui-kit": "^1.66.3", + "@dytesdk/react-web-core": "^1.36.5", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@dytesdk/ui-kit": "^1.66.3", + "@dytesdk/web-core": "^1.32.1", + "@types/react": "^18.0.24", + "@types/react-dom": "^18.0.8", + "@vitejs/plugin-react": "^2.2.0", + "autoprefixer": "^10.4.16", + "postcss": "^8.4.30", + "prettier": "^3.0.3", + "tailwindcss": "^3.3.3", + "typescript": "^4.6.4", + "vite": "^3.2.3" + } + }, + "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==", + "dev": true, + "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.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", + "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz", + "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.24.5", + "@babel/helpers": "^7.24.5", + "@babel/parser": "^7.24.5", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz", + "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.5", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", + "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz", + "integrity": "sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.24.3", + "@babel/helper-simple-access": "^7.24.5", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/helper-validator-identifier": "^7.24.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz", + "integrity": "sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz", + "integrity": "sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", + "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", + "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz", + "integrity": "sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==", + "dev": true, + "dependencies": { + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz", + "integrity": "sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.5", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", + "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", + "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", + "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.23.3", + "@babel/types": "^7.23.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", + "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", + "dev": true, + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.5.tgz", + "integrity": "sha512-RtCJoUO2oYrYwFPtR1/jkoBEcFuI1ae9a9IMxeyAVa3a1Ap4AnxmyIKG2b2FaJKqkidw/0cxRbWN+HOs6ZWd1w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.1.tgz", + "integrity": "sha512-1v202n7aUq4uXAieRTKcwPzNyphlCuqHHDcdSNc+vdhoTEZcFMh+L5yZuCmGaIO7bs1nJUNfHB89TZyoL48xNA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz", + "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz", + "integrity": "sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/parser": "^7.24.5", + "@babel/types": "^7.24.5", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", + "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.24.1", + "@babel/helper-validator-identifier": "^7.24.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@dyteinternals/awaitqueue": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@dyteinternals/awaitqueue/-/awaitqueue-3.0.1.tgz", + "integrity": "sha512-KooI+0lfAu13gUMuVtYlW//ti6MEvhqU8PP3jCXFqU2FSETOKHdtpBfHmBCE/Ass6+EStsDiVKLyh5XHNh+hsg==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@dyteinternals/mediasoup-client": { + "version": "3.6.89", + "resolved": "https://registry.npmjs.org/@dyteinternals/mediasoup-client/-/mediasoup-client-3.6.89.tgz", + "integrity": "sha512-T9tKCr3u9W2k7zqUTR9TeJalHm9SAzTRoDXGku/oj1apHUcjdALRKd8VhY03DrtoLQKjT8/L8cwV4Q0J3ViJUw==", + "dependencies": { + "@dyteinternals/awaitqueue": "^3.0.1", + "@types/debug": "^4.1.7", + "bowser": "^2.11.0", + "debug": "^4.3.4", + "events": "^3.3.0", + "h264-profile-level-id": "^1.0.1", + "queue-microtask": "^1.2.3", + "sdp-transform": "^2.14.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mediasoup" + } + }, + "node_modules/@dyteinternals/utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@dyteinternals/utils/-/utils-2.1.0.tgz", + "integrity": "sha512-oa05pVL82AZkElM4AxIT8ub+6Gzq+gqtE+PLUsulZLOCiIpQ6GYNwE/p721DpsAvTwSnHeqvBGE5Y2vrTKatJA==", + "dependencies": { + "axios": "^0.25.0", + "lodash-es": "^4.17.21" + } + }, + "node_modules/@dytesdk/react-ui-kit": { + "version": "1.66.3", + "resolved": "https://registry.npmjs.org/@dytesdk/react-ui-kit/-/react-ui-kit-1.66.3.tgz", + "integrity": "sha512-nBsPqQo4EePKQaY9+Hfn65I7ns4hY93eeanftH/f7gZHo1VpZRrdd8oeRahh+XkI43+nKQ6g/c3ZF1cY/xlIwQ==", + "dependencies": { + "@dytesdk/ui-kit": "1.66.3" + }, + "peerDependencies": { + "react": ">=16.8.6", + "react-dom": ">=16.8.6" + } + }, + "node_modules/@dytesdk/react-web-core": { + "version": "1.36.5", + "resolved": "https://registry.npmjs.org/@dytesdk/react-web-core/-/react-web-core-1.36.5.tgz", + "integrity": "sha512-LD4OG2Tx0YxTkkhVev0xAY2KeVmmXXk05LBPQ5M+8AZtd+jbjFJr2NWnsJKqBVEgBhWXHqP3Vjs8eN5J79nMfA==", + "dependencies": { + "@dytesdk/web-core": "^1.32.1" + }, + "peerDependencies": { + "react": ">=16.8.6" + } + }, + "node_modules/@dytesdk/ui-kit": { + "version": "1.66.3", + "resolved": "https://registry.npmjs.org/@dytesdk/ui-kit/-/ui-kit-1.66.3.tgz", + "integrity": "sha512-RTQSghU2k9CX1X4GyIWxucDIOEuZ+5wOlT9HEUhmYtIUHrcme5aMskB7CZCqRT/85T8k284Ege076CN+fihxjg==" + }, + "node_modules/@dytesdk/web-core": { + "version": "1.32.1", + "resolved": "https://registry.npmjs.org/@dytesdk/web-core/-/web-core-1.32.1.tgz", + "integrity": "sha512-PuXwpOK9mYO7lDUegiQhn4W16mrki2WRriKiI3o00vjvL5vlwOJDUEoGc3ys6w6oM0Zwf9MnJ07bRMaxA6X5lg==", + "dependencies": { + "@dyteinternals/mediasoup-client": "3.6.89", + "@dyteinternals/utils": "^2.1.0", + "@protobuf-ts/runtime": "^2.7.0", + "bowser": "^2.11.0", + "sdp-transform": "^2.14.1", + "socket.io-client": "4.6.2", + "uuid": "^8.3.2", + "worker-timers": "7.0.60" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", + "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", + "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "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/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@protobuf-ts/runtime": { + "version": "2.9.4", + "resolved": "https://registry.npmjs.org/@protobuf-ts/runtime/-/runtime-2.9.4.tgz", + "integrity": "sha512-vHRFWtJJB/SiogWDF0ypoKfRIZ41Kq+G9cEFj6Qm1eQaAhJ1LDFvgZ7Ja4tb3iLOQhz0PaoPnnOijF1qmEqTxg==" + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==" + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" + }, + "node_modules/@types/prop-types": { + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.1.tgz", + "integrity": "sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", + "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-2.2.0.tgz", + "integrity": "sha512-FFpefhvExd1toVRlokZgxgy2JtnBOdp4ZDsq7ldCWaqGSGn9UhWMAVm/1lxPL14JfNS5yGz+s9yFrQY6shoStA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.19.6", + "@babel/plugin-transform-react-jsx": "^7.19.0", + "@babel/plugin-transform-react-jsx-development": "^7.18.6", + "@babel/plugin-transform-react-jsx-self": "^7.18.6", + "@babel/plugin-transform-react-jsx-source": "^7.19.6", + "magic-string": "^0.26.7", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^3.0.0" + } + }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/autoprefixer": { + "version": "10.4.19", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", + "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", + "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.0", + "caniuse-lite": "^1.0.30001599", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axios": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz", + "integrity": "sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==", + "dependencies": { + "follow-redirects": "^1.14.7" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" + }, + "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/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001614", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001614.tgz", + "integrity": "sha512-jmZQ1VpmlRwHgdP1/uiKzgiAuGOfLEJsYFP4+GBou/QQ4U6IOJCB4NP1c+1p9RGLpwObcT94jA5/uO+F1vBbog==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/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==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.754", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.754.tgz", + "integrity": "sha512-7Kr5jUdns5rL/M9wFFmMZAgFDuL2YOnanFH4OI4iFzUqyh3XOL7nAGbSlSMZdzKMIyyTpNSbqZsWG9odwLeKvA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/engine.io-client": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.4.0.tgz", + "integrity": "sha512-GyKPDyoEha+XZ7iEqam49vz6auPnNJ9ZBfy89f+rMMas8AuiMWOZ9PVzu8xb9ZC6rafUqiGHSCfu22ih66E+1g==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.11.0", + "xmlhttprequest-ssl": "~2.0.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.7.tgz", + "integrity": "sha512-P+jDFbvK6lE3n1OL+q9KuzdOFWkkZ/cMV9gol/SbVfpyqfvrfrFTOFJ6fQm2VC3PZHlU3QPhVwmbsCnauHF2MQ==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/esbuild": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", + "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.15.18", + "@esbuild/linux-loong64": "0.15.18", + "esbuild-android-64": "0.15.18", + "esbuild-android-arm64": "0.15.18", + "esbuild-darwin-64": "0.15.18", + "esbuild-darwin-arm64": "0.15.18", + "esbuild-freebsd-64": "0.15.18", + "esbuild-freebsd-arm64": "0.15.18", + "esbuild-linux-32": "0.15.18", + "esbuild-linux-64": "0.15.18", + "esbuild-linux-arm": "0.15.18", + "esbuild-linux-arm64": "0.15.18", + "esbuild-linux-mips64le": "0.15.18", + "esbuild-linux-ppc64le": "0.15.18", + "esbuild-linux-riscv64": "0.15.18", + "esbuild-linux-s390x": "0.15.18", + "esbuild-netbsd-64": "0.15.18", + "esbuild-openbsd-64": "0.15.18", + "esbuild-sunos-64": "0.15.18", + "esbuild-windows-32": "0.15.18", + "esbuild-windows-64": "0.15.18", + "esbuild-windows-arm64": "0.15.18" + } + }, + "node_modules/esbuild-android-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz", + "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-android-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz", + "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz", + "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", + "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz", + "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz", + "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-32": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz", + "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz", + "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz", + "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz", + "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz", + "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz", + "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-riscv64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz", + "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-s390x": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz", + "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz", + "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz", + "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-sunos-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", + "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-32": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz", + "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz", + "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz", + "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "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-unique-numbers": { + "version": "8.0.13", + "resolved": "https://registry.npmjs.org/fast-unique-numbers/-/fast-unique-numbers-8.0.13.tgz", + "integrity": "sha512-7OnTFAVPefgw2eBJ1xj2PGGR9FwYzSUso9decayHgCDX4sJkHLdcsYTytTg+tYv+wKF3U8gJuSBz2jJpQV4u/g==", + "dependencies": { + "@babel/runtime": "^7.23.8", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.1.0" + } + }, + "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/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "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/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/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob": { + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.6", + "minimatch": "^9.0.1", + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/h264-profile-level-id": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/h264-profile-level-id/-/h264-profile-level-id-1.1.1.tgz", + "integrity": "sha512-xOEl3xKpiRrKIqSfolN+9gDdjR8aktKeB92CHIJohz8KtLF0Mceshgfi9pOyUhCpZmQzzwxGMSSxQvHTgGzrGw==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lilconfig": { + "version": "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/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz", + "integrity": "sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "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==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-scurry": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", + "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", + "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", + "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/prettier": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-refresh": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/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/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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/rollup": { + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/sdp-transform": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/sdp-transform/-/sdp-transform-2.14.2.tgz", + "integrity": "sha512-icY6jVao7MfKCieyo1AyxFYm1baiM+fA00qW/KrNNVlkxHAd34riEKuEkUe4bBb3gJwLJZM+xT60Yj1QL8rHiA==", + "bin": { + "sdp-verify": "checker.js" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/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/socket.io-client": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.6.2.tgz", + "integrity": "sha512-OwWrMbbA8wSqhBAR0yoPK6EdQLERQAYjXb3A0zLpgxfM1ZGLKoxHx8gVmCHA6pcclRX5oA/zvQf7bghAS11jRA==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.4.0", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "dev": true + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/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-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "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/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-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", + "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", + "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/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.14.tgz", + "integrity": "sha512-JixKH8GR2pWYshIPUg/NujK3JO7JiqEEUiNArE86NQyrgUuZeTlZQN3xuS/yiV5Kb48ev9K6RqNkaJjXsdg7Jw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vite": { + "version": "3.2.10", + "resolved": "https://registry.npmjs.org/vite/-/vite-3.2.10.tgz", + "integrity": "sha512-Dx3olBo/ODNiMVk/cA5Yft9Ws+snLOXrhLtrI3F4XLt4syz2Yg8fayZMWScPKoz12v5BUv7VEmQHnsfpY80fYw==", + "dev": true, + "dependencies": { + "esbuild": "^0.15.9", + "postcss": "^8.4.18", + "resolve": "^1.22.1", + "rollup": "^2.79.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/worker-timers": { + "version": "7.0.60", + "resolved": "https://registry.npmjs.org/worker-timers/-/worker-timers-7.0.60.tgz", + "integrity": "sha512-kom5j7+JQU0uuJAqAeFvxPpKlp21BH09YLMU/JLKA+0Zs3WTGk7WSBFYjdR3G+kjXr6qWD7zIcenv3oXaWBJzw==", + "dependencies": { + "@babel/runtime": "^7.20.6", + "tslib": "^2.4.1", + "worker-timers-broker": "^6.0.80", + "worker-timers-worker": "^7.0.46" + } + }, + "node_modules/worker-timers-broker": { + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/worker-timers-broker/-/worker-timers-broker-6.1.7.tgz", + "integrity": "sha512-8hb4lSMAijDY/Dp/MOw9Hc2x6uU59XWFYjcWQgC4bai+sxcLXjeexd9aYKdYMFZPiPoieGzMYIs9WGpv2Co3eA==", + "dependencies": { + "@babel/runtime": "^7.24.4", + "fast-unique-numbers": "^8.0.13", + "tslib": "^2.6.2", + "worker-timers-worker": "^7.0.70" + } + }, + "node_modules/worker-timers-worker": { + "version": "7.0.70", + "resolved": "https://registry.npmjs.org/worker-timers-worker/-/worker-timers-worker-7.0.70.tgz", + "integrity": "sha512-lemWEME0RHB78hzGkkQcKfF6L82gqVhV3T9iY14jHBhbLxLq9t1RRCLmPDBZV7sdnUoW6Khkfn6coqPjgEK6cw==", + "dependencies": { + "@babel/runtime": "^7.24.4", + "tslib": "^2.6.2" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xmlhttprequest-ssl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", + "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yaml": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.2.tgz", + "integrity": "sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==", + "dev": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + } + } +} diff --git a/samples/screenshare-focused-ui-with-custom-addons/package.json b/samples/screenshare-focused-ui-with-custom-addons/package.json new file mode 100644 index 0000000..23f90de --- /dev/null +++ b/samples/screenshare-focused-ui-with-custom-addons/package.json @@ -0,0 +1,31 @@ +{ + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview" + }, + "dependencies": { + "@dytesdk/react-ui-kit": "^2.0.0", + "@dytesdk/react-web-core": "^2.0.0", + "@dytesdk/video-background-transformer": "1.1.7", + "zustand": "^3.5.6", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@dytesdk/ui-kit": "^2.0.0", + "@dytesdk/web-core": "^2.0.0", + "@types/react": "^18.0.24", + "@types/react-dom": "^18.0.8", + "@vitejs/plugin-react": "^2.2.0", + "autoprefixer": "^10.4.16", + "postcss": "^8.4.30", + "prettier": "^3.0.3", + "tailwindcss": "^3.3.3", + "typescript": "^4.6.4", + "vite": "^3.2.3" + } +} diff --git a/samples/screenshare-focused-ui-with-custom-addons/postcss.config.js b/samples/screenshare-focused-ui-with-custom-addons/postcss.config.js new file mode 100644 index 0000000..2e7af2b --- /dev/null +++ b/samples/screenshare-focused-ui-with-custom-addons/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/samples/screenshare-focused-ui-with-custom-addons/src/App.tsx b/samples/screenshare-focused-ui-with-custom-addons/src/App.tsx new file mode 100644 index 0000000..30ca58e --- /dev/null +++ b/samples/screenshare-focused-ui-with-custom-addons/src/App.tsx @@ -0,0 +1,111 @@ +import { useEffect, useState } from 'react'; +import { + DyteProvider, + useDyteClient, + useDyteMeeting, +} from '@dytesdk/react-web-core'; +import './global.css'; +import { + defaultConfig, + generateConfig, +} from '@dytesdk/react-ui-kit'; +import { DyteStateListenersUtils } from './dyte-state-listeners'; +import { CustomStates } from './types'; +import { setFullScreenToggleTargetElement } from './utils'; +import CustomDyteMeeting from './components/custom-dyte-meeting'; + +function Meeting() { + const { meeting } = useDyteMeeting(); + const [config, setConfig] = useState(defaultConfig); + const [states, setStates] = useState({ + meeting: 'setup', + sidebar: 'chat' + }); + + useEffect(() => { + async function setupMeetingConfigs(){ + const theme = meeting!.self.config; + const { config } = generateConfig(theme, meeting!); + + /** + * NOTE(ravindra-dyte): + * Full screen by default requests dyte-meeting/DyteMeeting element to be in full screen. + * Since DyteMeeting element is not here, + * we need to pass dyte-fullscreen-toggle, an targetElementId through config. + */ + setFullScreenToggleTargetElement({config, targetElementId: 'root'}); + + setConfig({...config}); + + /** + * NOTE(ravindra-dyte): + * Add listeners on meeting & self to monitor leave meeting, join meeting and so on. + * This work was earlier done by DyteMeeting component internally. + */ + const stateListenersUtils = new DyteStateListenersUtils(() => meeting, () => states, () => setStates); + stateListenersUtils.addDyteEventListeners(); + } + + if(meeting){ + /** + * NOTE(ravindra-dyte): + * During development phase, make sure to expose meeting object to window, + * for debugging purposes. + */ + Object.assign(window, { + meeting, + }) + setupMeetingConfigs(); + } + + }, [meeting]); + + return + +} + +function App() { + const [meeting, initMeeting] = useDyteClient(); + + useEffect(() => { + async function initalizeMeeting(){ + const searchParams = new URL(window.location.href).searchParams; + + const authToken = searchParams.get('authToken'); + + if (!authToken) { + alert( + "An authToken wasn't passed, please pass an authToken in the URL query to join a meeting.", + ); + return; + } + + const meeting = await initMeeting({ + authToken, + defaults: { + audio: false, + video: false, + }, + modules: {devTools: {logs: true}} + }); + + // await meeting!.joinRoom(); + + } + + if(!meeting){ + initalizeMeeting(); + } + }, [meeting]); + + // By default this component will cover the entire viewport. + // To avoid that and to make it fill a parent container, pass the prop: + // `mode="fill"` to the component. + return ( + + + + ); +} + +export default App; diff --git a/samples/screenshare-focused-ui-with-custom-addons/src/components/Dialog.tsx b/samples/screenshare-focused-ui-with-custom-addons/src/components/Dialog.tsx new file mode 100644 index 0000000..d0fcdd5 --- /dev/null +++ b/samples/screenshare-focused-ui-with-custom-addons/src/components/Dialog.tsx @@ -0,0 +1,33 @@ +import { DyteButton, DyteIcon, defaultIconPack } from '@dytesdk/react-ui-kit'; +import { FC, ReactNode } from 'react'; + +type DialogProps = { + isOpen: boolean; + onClose: () => void; + header: string; + children: ReactNode; +}; +const Dialog: FC = ({ header, isOpen, children, onClose }) => { + if (!isOpen) return null; + return ( +
+
+ {/*
+

Effects

+
*/} + onClose()} + iconPack={defaultIconPack} + > + + + {children} +
+
+ ); +}; + +export default Dialog; diff --git a/samples/screenshare-focused-ui-with-custom-addons/src/components/EffectsManager.tsx b/samples/screenshare-focused-ui-with-custom-addons/src/components/EffectsManager.tsx new file mode 100644 index 0000000..56c63b1 --- /dev/null +++ b/samples/screenshare-focused-ui-with-custom-addons/src/components/EffectsManager.tsx @@ -0,0 +1,166 @@ +/* eslint-disable @next/next/no-img-element */ +import { DyteSwitch } from '@dytesdk/react-ui-kit'; +import Dialog from './Dialog'; +import { useEffect, useRef, useState } from 'react'; +import { storeSelector, useDyteStore } from '../lib/store'; +import DyteVideoBackgroundTransformer from '@dytesdk/video-background-transformer'; +import type DyteClient from '@dytesdk/web-core'; +import type { VideoMiddleware } from '@dytesdk/web-core'; + +export const getBackgroundImage = (name: string) => `https://assets.dyte.io/backgrounds/${name}`; +const IMAGE_URLS = [ + 'bg_0.jpg', + 'bg_1.jpg', + 'bg_2.jpg', + 'bg_3.jpg', + 'bg_4.jpg', + 'bg_5.jpg', + 'bg_6.jpg', +]; + +const MiddlewareHolder: { + currentVideo?: VideoMiddleware; + transformer?: DyteVideoBackgroundTransformer; +} = {}; + +const EffectsManager = ({ + meeting, + isOpen, + onClose, +}: { + meeting: DyteClient; + onClose: () => void; + isOpen: boolean; +}) => { + const [selected, setSelected] = useState('video'); + const { effects, updateStore } = useDyteStore(storeSelector); + const backgroundTransformerInit = useRef(false); + + useEffect(() => { + if (MiddlewareHolder.currentVideo) { + meeting?.self.removeVideoMiddleware(MiddlewareHolder.currentVideo); + MiddlewareHolder.currentVideo = undefined; + } + const load = async () => { + if (!meeting) return; + let isChatSDK = false; + if (meeting?.self.config.viewType === 'CHAT') { + isChatSDK = true; + } + if (!MiddlewareHolder.transformer) { + if ( + DyteVideoBackgroundTransformer.isSupported() && + !isChatSDK && + // prevent double init + backgroundTransformerInit.current !== true + ) { + backgroundTransformerInit.current = true; + const transformer = await DyteVideoBackgroundTransformer.init(); + MiddlewareHolder.transformer = transformer; + } else return; + } + // await meeting.self.setVideoMiddlewareGlobalConfig({ disablePerFrameCanvasRendering: true }); + if (effects.video.background === 'image') { + const imageURL = `https://assets.dyte.io/backgrounds/${effects.video.backgroundImage}`; + MiddlewareHolder.transformer + ?.createStaticBackgroundVideoMiddleware(imageURL) + .then((middleware: any) => { + MiddlewareHolder.currentVideo = middleware; + meeting?.self.addVideoMiddleware(middleware); + }); + } else if (effects.video.background === 'blur') { + MiddlewareHolder.transformer + ?.createBackgroundBlurVideoMiddleware() + .then((middleware: any) => { + MiddlewareHolder.currentVideo = middleware; + meeting?.self.addVideoMiddleware(middleware); + }); + } + }; + load(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [effects.video.background, effects.video.backgroundImage]); + + return ( + +
+ +
+ {selected === 'video' && ( +
+

Background

+
+
+ None { + const newEffects = { ...effects }; + newEffects.video.background = 'none'; + newEffects.video.backgroundImage = ''; + updateStore('effects', newEffects); + }} + /> +
+ +
+ Blur { + const newEffects = { ...effects }; + newEffects.video.background = 'blur'; + newEffects.video.backgroundImage = ''; + updateStore('effects', newEffects); + }} + /> +
+
+
+ {IMAGE_URLS.map((u, i) => ( +
+ {`Image { + const newEffects = { ...effects }; + newEffects.video.background = 'image'; + newEffects.video.backgroundImage = u; + updateStore('effects', newEffects); + }} + /> +
+ ))} +
+
+ )} +
+
+
+ ); +}; + +export default EffectsManager; diff --git a/samples/screenshare-focused-ui-with-custom-addons/src/components/ReactionsManager.tsx b/samples/screenshare-focused-ui-with-custom-addons/src/components/ReactionsManager.tsx new file mode 100644 index 0000000..d078ce1 --- /dev/null +++ b/samples/screenshare-focused-ui-with-custom-addons/src/components/ReactionsManager.tsx @@ -0,0 +1,62 @@ +/* eslint-disable @next/next/no-img-element */ +import { useEffect, useState } from 'react'; +import Dialog from './Dialog'; +import type DyteClient from '@dytesdk/web-core'; + +const ReactionsManager = ({ + meeting, + isOpen, + onClose, +}: { + meeting: DyteClient; + onClose: () => void; + isOpen: boolean; +}) => { + const [currentReaction, setCurrentReaction] = useState(''); + useEffect(() => { + if(!meeting){ + return; + } + meeting.participants.joined.addListener('participantJoined', () => { + // Hack - Re broadcast the message when a new participant joins + setTimeout(() => { + meeting.participants.broadcastMessage("reactions", { + reaction: currentReaction, + peerId: meeting.self.id, + }); + }, 1000); + }); + }, [meeting]); + + return ( + +
+
+
+ { + ['🔄', '😊', '🤔', '👀', '😎', '💗', '🔥', '👍🏼', '🚀', '💪'].map((reaction, index) => { + return ( +
= 1 ? 'inline-block': ''} m-5 text-3xl cursor-pointer`} + onClick={async () => { + setCurrentReaction(index === 0 ? '': reaction); + await meeting.participants.broadcastMessage("reactions", { + reaction: index === 0 ? '': reaction, + peerId: meeting.self.id, + }); + }} + >{reaction}
) + }) + } +
+
+
+
+ ); +}; + +export default ReactionsManager; diff --git a/samples/screenshare-focused-ui-with-custom-addons/src/components/audio-preview.tsx b/samples/screenshare-focused-ui-with-custom-addons/src/components/audio-preview.tsx new file mode 100644 index 0000000..01c3246 --- /dev/null +++ b/samples/screenshare-focused-ui-with-custom-addons/src/components/audio-preview.tsx @@ -0,0 +1,140 @@ +import DyteClient from "@dytesdk/web-core"; +import { useEffect, useRef, useState } from "react"; +import { DyteAudioVisualizer, DyteButton, DyteIcon, DyteSettingsAudio, DyteSwitch, defaultIconPack } from "@dytesdk/react-ui-kit"; +import { CustomStates, SetStates } from "../types"; +import { UIConfig } from "@dytesdk/ui-kit"; +interface CurrentDevices { + audio?: MediaDeviceInfo; + speaker?: MediaDeviceInfo; +} + +function AudioPreviewPreBuilt({ + meeting, states +}: { meeting: DyteClient, config: UIConfig, states: CustomStates, setStates: SetStates } +){ + return +} + +function AudioPreviewWithCustomUI({ + meeting, +}: { meeting: DyteClient, config: UIConfig, states: CustomStates, setStates: SetStates } +) { + const [audioDevices, setAudioDevices] = useState([]); + const [speakerDevices, setSpeakerDevices] = useState([]); + const [currentDevices, setCurrentDevices] = useState({}); + const testAudioEl = useRef(null); + useEffect(() => { + if (!meeting) { + return; + } + const deviceListUpdateCallback = async () => { + setAudioDevices(await meeting.self.getAudioDevices()); + setSpeakerDevices(await meeting.self.getSpeakerDevices()); + } + meeting.self.addListener('deviceListUpdate', deviceListUpdateCallback); + //populate first time values + deviceListUpdateCallback(); + setCurrentDevices({ + audio: meeting.self.getCurrentDevices().audio, + speaker: meeting.self.getCurrentDevices().speaker + }) + return () => { + meeting.self.removeListener('deviceListUpdate', deviceListUpdateCallback); + } + }, [meeting]) + const setDevice = (kind: 'audio' | 'speaker', deviceId: string) => { + // if (disableSettingSinkId(this.meeting)) return; + const device = + kind === 'audio' + ? audioDevices.find((d) => d.deviceId === deviceId) + : speakerDevices.find((d) => d.deviceId === deviceId); + setCurrentDevices((oldDevices) => { + return { + ...oldDevices, + [kind]: device, + } + }) + if (device != null) { + meeting.self.setDevice(device); + if (device.kind === 'audiooutput') { + if ((testAudioEl.current as any)?.setSinkId) { + (testAudioEl.current as any)?.setSinkId(device.deviceId) + }; + } + } + } + let unnamedMicCount = 0; + let unnamedSpeakerCount = 0; + const testAudio = () => { + testAudioEl?.current?.play(); + } + return ( +
+
+ ) +} + +export default AudioPreviewPreBuilt; // uncomment if you want to use prebuilt audio preview +// export default AudioPreviewWithCustomUI; // uncomment if you want custom ui for audio preview \ No newline at end of file diff --git a/samples/screenshare-focused-ui-with-custom-addons/src/components/custom-dyte-grid.css b/samples/screenshare-focused-ui-with-custom-addons/src/components/custom-dyte-grid.css new file mode 100644 index 0000000..bfd6cd0 --- /dev/null +++ b/samples/screenshare-focused-ui-with-custom-addons/src/components/custom-dyte-grid.css @@ -0,0 +1,22 @@ +.participants-with-shared-screen{ + display: flex; +} + +.stage-holder{ + display: flex; + width: 100%; + height: 60vh; + justify-content: center; +} + +.shared-screen{ + width: 100%; + display: flex; + justify-content: center; +} + +.participant-preview{ + display: flex; + justify-content: center; + width: 100%; +} \ No newline at end of file diff --git a/samples/screenshare-focused-ui-with-custom-addons/src/components/custom-dyte-grid.tsx b/samples/screenshare-focused-ui-with-custom-addons/src/components/custom-dyte-grid.tsx new file mode 100644 index 0000000..7fcd4bf --- /dev/null +++ b/samples/screenshare-focused-ui-with-custom-addons/src/components/custom-dyte-grid.tsx @@ -0,0 +1,194 @@ +import type DyteClient from '@dytesdk/web-core'; +import { UIConfig } from '@dytesdk/ui-kit/dist/types/types/ui-config'; +import { CustomStates, SetStates } from '../types'; +import { useDyteSelector } from '@dytesdk/react-web-core'; +import { defaultIconPack, DyteAudioVisualizer, DyteAvatar, DyteButton, DyteCameraToggle, DyteControlbarButton, DyteIcon, DyteMicToggle, DyteNameTag, DyteParticipantTile, DyteScreenshareView } from '@dytesdk/react-ui-kit'; + +import './custom-dyte-grid.css'; +import { useEffect, useState } from 'react'; +import { DyteParticipant, DyteSelf } from '@dytesdk/web-core'; +import CustomParticipantTile from './custom-participant-tile'; + +function CustomDyteGridScreenshareFocused({ + meeting, + config, + states, + setStates, +}: { meeting: DyteClient, config: UIConfig, states: CustomStates, setStates: SetStates}) { + + const [size] = useState({ height: '120px', width: '120px' }); + + const [selectedSharedScreenParticipant, setSelectedSharedScreenParticipant] = useState(null); + + const [selectedParticipant, setSelectedParticipant] = useState(meeting.self); + + const [handRaisedPeerIds, setHandRaisedPeerIds] = useState([]); + + const [reactions, setReactions] = useState<{[key: string]: string}>({}); + + const activeParticipants = useDyteSelector((meeting) => + meeting.participants.active.toArray() + ); + + const pinnedParticipants = useDyteSelector((meeting) => + meeting.participants.pinned.toArray() + ); + + const screensharedParticipants = useDyteSelector((meeting) => { + const allParticipants = [meeting.self, ...meeting.participants.joined.toArray()]; + return allParticipants.filter((p) => p.screenShareEnabled); + }); + + const participants = [ + meeting.self, + ...pinnedParticipants, + ...activeParticipants.filter((p) => !pinnedParticipants.includes(p)), + ]; + + useEffect(() => { + if(!meeting){ + return; + } + meeting.participants.joined.on('participantLeft', (participant) => { + if(selectedParticipant?.id === participant.id){ + setSelectedParticipant(meeting.self); + } + if(selectedSharedScreenParticipant?.id === participant.id){ + setSelectedSharedScreenParticipant(null); + } + }); + }, [meeting]); + + useEffect(() => { + meeting.participants.addListener('broadcastedMessage', broadcastedMessage => { + if(broadcastedMessage.type === 'raised-hand'){ + setHandRaisedPeerIds((prev) => { + return [...prev, broadcastedMessage.payload.peerId?.toString()]; + }); + } + if(broadcastedMessage.type === 'lowered-hand'){ + setHandRaisedPeerIds((prev) => { + const currentHandRaised = prev.filter(peerId => peerId !== broadcastedMessage.payload.peerId?.toString()); + return currentHandRaised; + }); + } + }); + }, [meeting]); + + useEffect(() => { + meeting.participants.addListener('broadcastedMessage', broadcastedMessage => { + if(broadcastedMessage.type === 'reactions'){ + setReactions((prev) => { + return { + ...prev, + [broadcastedMessage.payload.peerId?.toString()]: broadcastedMessage.payload.reaction?.toString(), + }; + }); + } + }); + }, [meeting]); + + useEffect(() => { + if(screensharedParticipants.length === 0){ + setSelectedSharedScreenParticipant(null); + setSelectedParticipant(meeting.self); + } + if(screensharedParticipants.length >= 1 && !selectedParticipant && !selectedSharedScreenParticipant){ + setSelectedSharedScreenParticipant(screensharedParticipants[0]); + } + }, [screensharedParticipants]); + + return ( +
+
+ { + participants.map(participant => { + return ( +
+ { + setSelectedParticipant(participant); + setSelectedSharedScreenParticipant(null); + }} + /> +
+ ) + }) + } +
+
+ { + screensharedParticipants.length >= 1 && ( +
+
Shared screens:
+ {screensharedParticipants.map(participant => { + return ( +
+ { + setSelectedParticipant(null); + setSelectedSharedScreenParticipant(participant) + }} + > +
+ + + {participant.id === meeting?.self.id ? 'you' : participant.name} + +
+
+
+ ) + }) + } +
+ )} + { + selectedSharedScreenParticipant && ( +
+ +
+ ) + } + {selectedParticipant && ( + + )} +
+
+ ); +} + +export default CustomDyteGridScreenshareFocused; \ No newline at end of file diff --git a/samples/screenshare-focused-ui-with-custom-addons/src/components/custom-dyte-meeting.tsx b/samples/screenshare-focused-ui-with-custom-addons/src/components/custom-dyte-meeting.tsx new file mode 100644 index 0000000..55e07c1 --- /dev/null +++ b/samples/screenshare-focused-ui-with-custom-addons/src/components/custom-dyte-meeting.tsx @@ -0,0 +1,37 @@ +import { UIConfig } from "@dytesdk/ui-kit" +import DyteClient from "@dytesdk/web-core" +import { CustomStates, SetStates } from "../types" +import InMeeting from "./in-meeting" +import MeetingLoading from "./meeting-loading" +import MeetingOver from "./meeting-over" +import SetupScreen from "./setup-screen" +import WaitingRoom from "./waiting-room" + +function CustomDyteMeeting({ + meeting, + config, + states, + setStates, +}: { meeting: DyteClient, config: UIConfig, states: CustomStates, setStates: SetStates}){ + if (!meeting) { + + } + + if (states.meeting === 'setup') { + return + } + + if(states.meeting === 'ended'){ + return + } + + if(states.meeting === 'waiting'){ + return + } + + if(states.meeting === 'joined'){ + return + } +} + +export default CustomDyteMeeting; \ No newline at end of file diff --git a/samples/screenshare-focused-ui-with-custom-addons/src/components/custom-participant-tile.tsx b/samples/screenshare-focused-ui-with-custom-addons/src/components/custom-participant-tile.tsx new file mode 100644 index 0000000..13d8b18 --- /dev/null +++ b/samples/screenshare-focused-ui-with-custom-addons/src/components/custom-participant-tile.tsx @@ -0,0 +1,51 @@ +import { DyteParticipantTile, DyteAvatar, DyteNameTag, DyteAudioVisualizer, DyteIcon } from "@dytesdk/react-ui-kit"; +import DyteClient, { DyteParticipant, DyteSelf } from "@dytesdk/web-core"; + +function CustomParticipantTile({ + meeting, participant, hasRaisedHand, reaction, onClick, style={} +}: { + meeting: DyteClient, + participant: DyteParticipant | DyteSelf, + hasRaisedHand: boolean, + reaction: string, + onClick?: () => void, + style?: {[key:string]: string}, +}){ +return ( +
+ + +
+ + + +
+
+ { + hasRaisedHand && ( + + ) + } + { + reaction && ( +
+ {reaction} +
+ ) + } +
+
+
+) +} + +export default CustomParticipantTile; \ No newline at end of file diff --git a/samples/screenshare-focused-ui-with-custom-addons/src/components/in-meeting.tsx b/samples/screenshare-focused-ui-with-custom-addons/src/components/in-meeting.tsx new file mode 100644 index 0000000..a8587b2 --- /dev/null +++ b/samples/screenshare-focused-ui-with-custom-addons/src/components/in-meeting.tsx @@ -0,0 +1,73 @@ +import type DyteClient from '@dytesdk/web-core'; +import { UIConfig } from '@dytesdk/ui-kit/dist/types/types/ui-config'; +import { CustomStates, SetStates } from '../types'; +import { DyteHeader, DyteStage, DyteGrid, DyteNotifications, DyteSidebar, DyteParticipantsAudio, DyteDialogManager, DyteControlbar, DyteControlbarButton } from '@dytesdk/react-ui-kit'; +import MeetingHeader from './meeting-header'; +import MeetingControlBar from './meeting-control-bar'; +import MeetingSideBar from './meeting-sidebar'; +import CustomDyteGrid from './custom-dyte-grid'; +import EffectsManager from './EffectsManager'; +import { useState } from 'react'; +import ReactionsManager from './ReactionsManager'; +function InMeeting({ + meeting, + config, + states, + setStates, +}: { meeting: DyteClient, config: UIConfig, states: CustomStates, setStates: SetStates}) { + + const [effectsDialog, setEffectsDialog] = useState(false); + const [reactionsDialog, setReactionsDialog] = useState(false); + + return ( +
{ + el?.addEventListener('dyteStateUpdate', (e) => { + const { detail: newStateUpdate } = e as unknown as { detail: CustomStates }; + console.log('dyteStateUpdateSetup:: ', newStateUpdate); + setStates((oldState: CustomStates) => { return { + ...oldState, + ...newStateUpdate, + }}); + }); + }} + > +
+ +
+ +
+ + + + + + + +
+ +
+ +
+ + setEffectsDialog(false)} + /> + + setReactionsDialog(false)} + /> + +
+ ); +} + +export default InMeeting; \ No newline at end of file diff --git a/samples/screenshare-focused-ui-with-custom-addons/src/components/media-preview-modal.tsx b/samples/screenshare-focused-ui-with-custom-addons/src/components/media-preview-modal.tsx new file mode 100644 index 0000000..d508975 --- /dev/null +++ b/samples/screenshare-focused-ui-with-custom-addons/src/components/media-preview-modal.tsx @@ -0,0 +1,60 @@ +import { DyteDialog, DyteIcon, defaultIconPack } from "@dytesdk/react-ui-kit"; +import { useState } from "react"; +import DyteClient from "@dytesdk/web-core"; +import { UIConfig } from "@dytesdk/ui-kit"; +import AudioPreview from "./audio-preview"; +import VideoPreview from "./video-preview"; +import { CustomStates, SetStates } from "../types"; + +function MediaPreviewModal({ + open, states, setStates, meeting, config, +}: { open: boolean, config: UIConfig, states: CustomStates, setStates: SetStates, meeting: DyteClient }) { + const [activeTab, setActiveTab] = useState<'audio' | 'video'>('video'); + return ( + setStates((oldState: CustomStates) => { return { + ...oldState, + activeMediaPreviewModal: false + }})} + > +
+ +
+ {activeTab === 'audio' && } + {activeTab === 'video' && } +
+
+
+ ) +} + +export default MediaPreviewModal; \ No newline at end of file diff --git a/samples/screenshare-focused-ui-with-custom-addons/src/components/meeting-control-bar.tsx b/samples/screenshare-focused-ui-with-custom-addons/src/components/meeting-control-bar.tsx new file mode 100644 index 0000000..68125a6 --- /dev/null +++ b/samples/screenshare-focused-ui-with-custom-addons/src/components/meeting-control-bar.tsx @@ -0,0 +1,98 @@ +import { DyteBreakoutRoomsToggle, DyteCameraToggle, DyteChatToggle, DyteControlbar, DyteControlbarButton, DyteFullscreenToggle, DyteLeaveButton, DyteMicToggle, DyteMoreToggle, DyteMuteAllButton, DyteParticipantsToggle, DytePipToggle, DytePluginsToggle, DytePoll, DytePollsToggle, DyteRecordingToggle, DyteScreenShareToggle, DyteSettingsToggle, DyteStageToggle } from "@dytesdk/react-ui-kit"; +import { UIConfig, defaultIconPack } from "@dytesdk/ui-kit"; +import DyteClient from "@dytesdk/web-core"; +import { CustomStates, SetStates } from "../types"; +import { useEffect, useState } from "react"; + +function ControlBarPreBuilt({ + meeting, states, config, +}: { meeting: DyteClient, config: UIConfig, states: CustomStates, setStates: SetStates } +){ + return ; +} + +function ControlBarWithCustomUI({ + meeting, states, config, setStates, setEffectsDialog, setReactionsDialog, +}: { meeting: DyteClient, config: UIConfig, states: CustomStates, setStates: SetStates, setEffectsDialog: (openEffectsDialog: boolean) => void, setReactionsDialog: (openReactionsDialog: boolean) => void} +){ + + const fullScreenTargetElement = document.querySelector('#root') as HTMLElement; + + const [handRaised, setHandRaised] = useState(false); + + useEffect(() => { + if(!meeting){ + return; + } + meeting.participants.joined.addListener('participantJoined', () => { + setTimeout(() => { + // Hack - Re broadcast the message when a new participant joins + meeting.participants.broadcastMessage(handRaised? "raised-hand" : "lowered-hand", { + peerId: meeting.self.id, + }); + }, 1000); + }); + }, [meeting]); + + return
+
+ + + +
+
+ + + + + +
+ + + + +
+
+
+
+ + + + + { + if(states.activeSidebar && !states.sidebar && states.customSidebar === 'warnings'){ + setStates( (oldState) => { return { ...oldState, activeSidebar: false, sidebar: null, customSidebar: null }}); + } else { + setStates( (oldState) => { return { ...oldState, activeSidebar: true, sidebar: null, customSidebar: 'warnings' }}); + } + }} + icon={defaultIconPack.add} + label={'Open Custom SideBar'} + /> + setEffectsDialog(true)} + icon={defaultIconPack.ai_sparkle} + label={'Effects'} + /> + { + setHandRaised(!handRaised); + await meeting.participants.broadcastMessage(handRaised? "lowered-hand" : "raised-hand", { + peerId: meeting.self.id, + }); + }} + icon='' + label={handRaised? 'Lower hand': 'Raise Hand'} + /> + setReactionsDialog(true)} + icon='smiley' + label={'Reactions'} + /> +
+
+} + +// export default ControlBarPreBuilt; // uncomment if you are fine with prebuilt control bar +export default ControlBarWithCustomUI; // uncomment if you want to create a custom control bar \ No newline at end of file diff --git a/samples/screenshare-focused-ui-with-custom-addons/src/components/meeting-header.tsx b/samples/screenshare-focused-ui-with-custom-addons/src/components/meeting-header.tsx new file mode 100644 index 0000000..edc34c5 --- /dev/null +++ b/samples/screenshare-focused-ui-with-custom-addons/src/components/meeting-header.tsx @@ -0,0 +1,37 @@ +import { DyteClock, DyteGridPagination, DyteHeader, DyteLivestreamIndicator, DyteLogo, DyteMeetingTitle, DyteParticipantCount, DyteRecordingIndicator, DyteViewerCount } from "@dytesdk/react-ui-kit"; +import { UIConfig } from "@dytesdk/ui-kit"; +import DyteClient from "@dytesdk/web-core"; +import { CustomStates, SetStates } from "../types"; + +function HeaderPreBuilt({ + meeting, states, config, setStates, +}: { meeting: DyteClient, config: UIConfig, states: CustomStates, setStates: SetStates } +){ + return ; +} + +function HeaderWithCustomUI({ + meeting, states, config, +}: { meeting: DyteClient, config: UIConfig, states: CustomStates, setStates: SetStates } +){ + + return
+
+ + + +
+
+ +
+
+ + + + +
+
+} + +export default HeaderPreBuilt; // uncomment if you want the pre built Dyte header +// export default HeaderWithCustomUI; // uncomment if yoi want custom UI \ No newline at end of file diff --git a/samples/screenshare-focused-ui-with-custom-addons/src/components/meeting-loading.tsx b/samples/screenshare-focused-ui-with-custom-addons/src/components/meeting-loading.tsx new file mode 100644 index 0000000..281b71e --- /dev/null +++ b/samples/screenshare-focused-ui-with-custom-addons/src/components/meeting-loading.tsx @@ -0,0 +1,11 @@ +import { DyteSpinner } from "@dytesdk/react-ui-kit"; + +function MeetingLoading() { + /** + * NOTE(ravindra-dyte): Don't like the default spinner? + * You can replace DyteSpinner with your own screen, here. + */ + return ; +} + +export default MeetingLoading; \ No newline at end of file diff --git a/samples/screenshare-focused-ui-with-custom-addons/src/components/meeting-over.tsx b/samples/screenshare-focused-ui-with-custom-addons/src/components/meeting-over.tsx new file mode 100644 index 0000000..355c0b5 --- /dev/null +++ b/samples/screenshare-focused-ui-with-custom-addons/src/components/meeting-over.tsx @@ -0,0 +1,18 @@ +import { DyteEndedScreen } from "@dytesdk/react-ui-kit"; +import { UIConfig } from "@dytesdk/ui-kit"; +import DyteClient from "@dytesdk/web-core"; +import { CustomStates, SetStates } from "../types"; + +function MeetingOver({ + meeting, + config, + states, +}: { meeting: DyteClient, config: UIConfig, states: CustomStates, setStates: SetStates}) { + return ( +
+ +
+ ); +} + +export default MeetingOver; \ No newline at end of file diff --git a/samples/screenshare-focused-ui-with-custom-addons/src/components/meeting-sidebar.tsx b/samples/screenshare-focused-ui-with-custom-addons/src/components/meeting-sidebar.tsx new file mode 100644 index 0000000..b4770a8 --- /dev/null +++ b/samples/screenshare-focused-ui-with-custom-addons/src/components/meeting-sidebar.tsx @@ -0,0 +1,76 @@ +import { DyteChat, DyteParticipants, DytePlugins, DytePolls, DyteSidebar, DyteSidebarUi } from "@dytesdk/react-ui-kit"; +import { UIConfig } from "@dytesdk/ui-kit"; +import DyteClient from "@dytesdk/web-core"; +import { CustomSideBarTabs, CustomStates, SetStates } from "../types"; +import { useEffect, useState } from "react"; +import { DyteSidebarView } from "@dytesdk/ui-kit/dist/types/components/dyte-sidebar-ui/dyte-sidebar-ui"; +import { DyteSidebarSection } from "@dytesdk/ui-kit/dist/types/components/dyte-sidebar/dyte-sidebar"; + +function SidebarPreBuilt({ + meeting, states, config, setStates, +}: { meeting: DyteClient, config: UIConfig, states: CustomStates, setStates: SetStates } +){ + if(!states.activeSidebar){ + return null; + } + return ; +} + +function SidebarWithCustomUI({ + meeting, states, config, setStates, +}: { meeting: DyteClient, config: UIConfig, states: CustomStates, setStates: SetStates } +){ + const [tabs, setTabs] = useState([ + { id: 'chat', name: 'chat' }, + { id: 'polls', name: 'polls' }, + { id: 'participants', name: 'participants' }, + { id: 'plugins', name: 'plugins' }, + { id: 'warnings', name: 'warnings' } + ]); + const [view, setView] = useState('sidebar'); + + if(!states.activeSidebar || (!states.sidebar && !states.customSidebar)){ + return null; + } + + const currentTab = states.sidebar || states.customSidebar; + + return ( + { + setStates((oldState) => { + return { + ...oldState, + activeSidebar: true, + customSidebar: e.detail, + sidebar: e.detail, + } + }); + }} + className="w-80 " + onSidebarClose={() => { + setStates((oldState) => { + return { + ...oldState, + activeSidebar: false, + sidebar: null, + customSidebar: null, + } + }); + }}> + {currentTab === 'chat' && } + {currentTab === 'polls' && } + {currentTab === 'participants' && } + {currentTab === 'plugins' && } + {currentTab === 'warnings' &&
+
Do not cheat in the exam
+
} +
); + +} + +// export default SidebarPreBuilt; // Uncomment if you want prebuilt sidebar +export default SidebarWithCustomUI; // Uncomment if you want custom sidebar diff --git a/samples/screenshare-focused-ui-with-custom-addons/src/components/setup-screen.tsx b/samples/screenshare-focused-ui-with-custom-addons/src/components/setup-screen.tsx new file mode 100644 index 0000000..6ae4a24 --- /dev/null +++ b/samples/screenshare-focused-ui-with-custom-addons/src/components/setup-screen.tsx @@ -0,0 +1,192 @@ +import type DyteClient from '@dytesdk/web-core'; +import { UIConfig } from '@dytesdk/ui-kit/dist/types/types/ui-config'; +import { CustomStates, SetStates } from '../types'; +import { DyteDialogManager, DyteSetupScreen } from '@dytesdk/react-ui-kit'; +import { DyteParticipantTile, DyteAvatar, DyteNameTag, DyteAudioVisualizer, DyteMicToggle, DyteCameraToggle, DyteSettingsToggle, DyteButton, DyteControlbarButton, defaultIconPack, } from "@dytesdk/react-ui-kit"; +import MediaPreviewModal from "./media-preview-modal"; +import { useEffect, useState } from 'react'; + +export function SetupScreenPreBuilt({ + meeting, + config, + states, + setStates, +}: { meeting: DyteClient, config: UIConfig, states: CustomStates, setStates: SetStates}) { + return ( +
{ + el?.addEventListener('dyteStateUpdate', (e) => { + const { detail: newStateUpdate } = e as unknown as { detail: CustomStates }; + console.log('dyteStateUpdateSetup:: ', newStateUpdate); + setStates((oldState: CustomStates) => { return { + ...oldState, + ...newStateUpdate, + }}); + }); + }}> + + +
+ ); +} + +export function CustomSetupScreenWithPrebuiltMediaPreviewModal({ + meeting, + config, + states, + setStates, +}: { meeting: DyteClient, config: UIConfig, states: CustomStates, setStates: SetStates}){ + const [participantName, setParticipantName] = useState(''); + + useEffect(() => { + if (!meeting) { + return; + } + setParticipantName(meeting.self.name); + }, [meeting]); + + return ( +
{ + el?.addEventListener('dyteStateUpdate', (e) => { + const { detail: newStateUpdate } = e as unknown as { detail: CustomStates }; + console.log('dyteStateUpdateSetup:: ', newStateUpdate); + setStates((oldState: CustomStates) => { return { + ...oldState, + ...newStateUpdate, + }}); + }); + }}> +
+
+ + + + + +
+ + + +
+
+ +
+
+
+
+

Joining as

+
{participantName}
+
+ setParticipantName(event.target.value)} + /> + { + if (participantName) { + if (meeting.self.permissions.canEditDisplayName) { + await meeting.self.setName(participantName); + } + await meeting.join(); + } + }}> + Join + +
+
+
+ +
+ ) + +} + +export function CustomSetupScreenWithCustomMediaPreviewModal({ + meeting, + config, + states, + setStates, +}: { meeting: DyteClient, config: UIConfig, states: CustomStates, setStates: SetStates}){ + const [participantName, setParticipantName] = useState(''); + + useEffect(() => { + if (!meeting) { + return; + } + setParticipantName(meeting.self.name); + }, [meeting]); + + return ( +
+
+ + + + + +
+ + + +
+
+ setStates( (oldState) => { return { ...oldState, activeMediaPreviewModal: true }})} + icon={defaultIconPack.settings} + label={'Media Preview'} + /> +
+
+
+
+

Joining as

+
{participantName}
+
+ setParticipantName(event.target.value)} + /> + { + if (participantName) { + if (meeting.self.permissions.canEditDisplayName) { + await meeting.self.setName(participantName); + } + await meeting.join(); + } + }}> + Join + +
+ +
+
+ ) + +} + +export default SetupScreenPreBuilt; // Uncomment, if you want prebuild setup screen +// export default CustomSetupScreenWithPrebuiltMediaPreviewModal; // Uncomment, if you want custom setup screen with prebuilt media preview +// export default CustomSetupScreenWithCustomMediaPreviewModal; // Uncomment, if you want custom setup screen with custom media preview \ No newline at end of file diff --git a/samples/screenshare-focused-ui-with-custom-addons/src/components/video-preview.tsx b/samples/screenshare-focused-ui-with-custom-addons/src/components/video-preview.tsx new file mode 100644 index 0000000..11ed66e --- /dev/null +++ b/samples/screenshare-focused-ui-with-custom-addons/src/components/video-preview.tsx @@ -0,0 +1,98 @@ +import DyteClient from "@dytesdk/web-core"; +import { useEffect, useRef, useState } from "react"; +import { DyteAudioVisualizer, DyteButton, DyteIcon, DyteParticipantTile, DyteSettingsVideo, DyteSwitch, defaultIconPack } from "@dytesdk/react-ui-kit"; +import { CustomStates, SetStates } from "../types"; +import { UIConfig } from "@dytesdk/ui-kit"; +interface CurrentDevices { + video?: MediaDeviceInfo +} + +function VideoPreviewPreBuilt({ + meeting, states +}: { meeting: DyteClient, config: UIConfig, states: CustomStates, setStates: SetStates } +){ + return +} + +function VideoPreviewWithCustomUI({ + meeting, states, setStates +}: { meeting: DyteClient, config: UIConfig, states: CustomStates, setStates: SetStates } +) { + const [videoDevices, setVideoDevices] = useState([]); + const [currentDevices, setCurrentDevices] = useState({}); + useEffect(() => { + if (!meeting) { + return; + } + + const deviceListUpdateCallback = async () => { + setVideoDevices(await meeting.self.getVideoDevices()); + } + meeting.self.addListener('deviceListUpdate', deviceListUpdateCallback); + //populate first time values + deviceListUpdateCallback(); + setCurrentDevices({ + video: meeting.self.getCurrentDevices().video + }) + return () => { + meeting.self.removeListener('deviceListUpdate', deviceListUpdateCallback); + } + }, [meeting]) + const setDevice = async (kind: 'video', deviceId: string) => { + const device = videoDevices.find((d) => d.deviceId === deviceId); + setCurrentDevices((oldDevices) => { + return { + ...oldDevices, + [kind]: device, + } + }) + if (device != null) { + await meeting?.self.setDevice(device); + } + } + let unnamedCameraCount = 0; + return ( +
+
+ {meeting.self.videoEnabled === true ? ( + + ) : ( +
+ +
+ +
Camera Off
+
+
+
+ )} +
+
+ +
+ +
+
+
+ ); +} + +export default VideoPreviewPreBuilt; // uncomment if you want to use prebuilt video preview +// export default VideoPreviewWithCustomUI; // uncomment if you want custom ui for video preview \ No newline at end of file diff --git a/samples/screenshare-focused-ui-with-custom-addons/src/components/waiting-room.tsx b/samples/screenshare-focused-ui-with-custom-addons/src/components/waiting-room.tsx new file mode 100644 index 0000000..39cc5f7 --- /dev/null +++ b/samples/screenshare-focused-ui-with-custom-addons/src/components/waiting-room.tsx @@ -0,0 +1,20 @@ +import { DyteWaitingScreen } from "@dytesdk/react-ui-kit"; +import { UIConfig } from "@dytesdk/ui-kit"; +import DyteClient from "@dytesdk/web-core"; +import { CustomStates, SetStates } from "../types"; + +function WaitingRoom({ + meeting, + config, +}: { meeting: DyteClient, config: UIConfig, states: CustomStates, setStates: SetStates}) { + return ( +
+ +
+ ); +} + +export default WaitingRoom; \ No newline at end of file diff --git a/samples/screenshare-focused-ui-with-custom-addons/src/dyte-state-listeners.tsx b/samples/screenshare-focused-ui-with-custom-addons/src/dyte-state-listeners.tsx new file mode 100644 index 0000000..6f68441 --- /dev/null +++ b/samples/screenshare-focused-ui-with-custom-addons/src/dyte-state-listeners.tsx @@ -0,0 +1,108 @@ +import DyteClient from '@dytesdk/web-core'; +import type { PermissionSettings } from '@dytesdk/ui-kit/dist/types/types/props'; +import type { RoomLeftState } from '@dytesdk/ui-kit/dist/types/types/dyte-client'; +import { CustomStates } from './types'; + +export class DyteStateListenersUtils{ + + getStates: () => CustomStates; + + getStateSetter: () => (newState: CustomStates) => void; + + getMeeting: () => DyteClient; + + get states(){ + return this.getStates(); + } + + get setGlobalStates(){ + return this.getStateSetter(); + }; + + get meeting(){ + return this.getMeeting(); + } + + constructor(getMeeting: () => DyteClient, getGlobalStates: () => CustomStates, getGlobalStateSetter: () => (newState: CustomStates) => void){ + this.getMeeting = getMeeting; + this.getStates = getGlobalStates; + this.getStateSetter = getGlobalStateSetter; + } + private updateStates(newState: CustomStates){ + this.setGlobalStates((oldState: CustomStates) => { return { + ...oldState, + ...newState, + }}); + console.log(newState); + } + private roomJoinedListener = () => { + this.updateStates({ meeting: 'joined' }); + }; + + private socketServiceRoomJoinedListener = () => { + if (this.meeting.stage.status === 'ON_STAGE' || this.meeting.stage.status === undefined) return; + this.updateStates({ meeting: 'joined' }); + }; + + private waitlistedListener = () => { + this.updateStates({ meeting: 'waiting' }); + }; + + private roomLeftListener = ({ state }: { state: RoomLeftState }) => { + const states = this.states; + if (states?.roomLeftState === 'disconnected') { + this.updateStates({ meeting: 'ended', roomLeftState: state }); + return; + } + this.updateStates({ meeting: 'ended', roomLeftState: state }); + }; + + private mediaPermissionUpdateListener = ({ kind, message }: { + kind: PermissionSettings['kind'], + message: string, + }) => { + if (['audio', 'video'].includes(kind!)) { + if (message === 'ACCEPTED' || message === 'NOT_REQUESTED' || this.states.activeDebugger) + return; + const permissionModalSettings: PermissionSettings = { + enabled: true, + kind, + }; + this.updateStates({ activePermissionsMessage: permissionModalSettings }); + } + }; + + private joinStateAcceptedListener = () => { + this.updateStates({ activeJoinStage: true }); + }; + + private handleChangingMeeting(destinationMeetingId: string) { + this.updateStates({ + activeBreakoutRoomsManager: { + ...this.states.activeBreakoutRoomsManager, + active: this.states.activeBreakoutRoomsManager!.active, + destinationMeetingId, + } + }); + } + + addDyteEventListeners(){ + if (this.meeting.meta.viewType === 'LIVESTREAM') { + this.meeting.self.addListener('socketServiceRoomJoined', this.socketServiceRoomJoinedListener); + } + this.meeting.self.addListener('roomJoined', this.roomJoinedListener); + + this.meeting.self.addListener('waitlisted', this.waitlistedListener); + this.meeting.self.addListener('roomLeft', this.roomLeftListener); + this.meeting.self.addListener('mediaPermissionUpdate', this.mediaPermissionUpdateListener); + this.meeting.self.addListener('joinStageRequestAccepted', this.joinStateAcceptedListener); + + if (this.meeting.connectedMeetings.supportsConnectedMeetings) { + this.meeting.connectedMeetings.once('changingMeeting', this.handleChangingMeeting); + } + + } + cleanupDyteEventListeners(){ + + } +} \ No newline at end of file diff --git a/samples/screenshare-focused-ui-with-custom-addons/src/global.css b/samples/screenshare-focused-ui-with-custom-addons/src/global.css new file mode 100644 index 0000000..dd82e33 --- /dev/null +++ b/samples/screenshare-focused-ui-with-custom-addons/src/global.css @@ -0,0 +1,58 @@ +.DyteDialog aside button { + @apply cursor-pointer transition-colors; + @apply box-border flex w-full items-center justify-between rounded-l-sm px-4 py-3; + @apply cursor-pointer shadow-none; + @apply border-none outline-none; + } + + .DyteDialog aside button.active { + background: rgba(26,144,255,0.15); + border-right: theme('borderWidth.2') solid theme('colors.blue.500'); + } + + .DyteDialog main { + @apply p-10 pl-6; + width: 30rem; + background-color: #191919; + } + + .DyteDialog { + @apply fixed inset-0 box-border rounded-md; + @apply flex-col items-center justify-center; + /* Hide dialog by default */ + @apply invisible hidden; + color: white; + + z-index: 60; + + backdrop-filter: blur(12px) saturate(180%); + } + + .DyteDialog #dialog { + @apply relative max-h-full max-w-full rounded-md; + min-height: 320px; + background-color: #262626; + } + + .DyteDialog #dismiss-btn { + @apply absolute top-3 right-3 z-50; + } + + .DyteDialog header { + @apply absolute top-3 left-3 z-50; + @apply text-xl font-semibold; + } + + .DyteDialog::slotted(*) { + @apply max-h-full max-w-full; + } + + /* Show only when open="true" */ + .DyteDialog[data-open] { + @apply visible flex; + } + + /* Hide dialog by default */ + .DyteDialog[data-open='false'] { + @apply invisible hidden; + } \ No newline at end of file diff --git a/samples/screenshare-focused-ui-with-custom-addons/src/index.css b/samples/screenshare-focused-ui-with-custom-addons/src/index.css new file mode 100644 index 0000000..33ec4d9 --- /dev/null +++ b/samples/screenshare-focused-ui-with-custom-addons/src/index.css @@ -0,0 +1,11 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + html, + body, + #root { + height: 100%; + } +} \ No newline at end of file diff --git a/samples/screenshare-focused-ui-with-custom-addons/src/lib/graceful-storage.ts b/samples/screenshare-focused-ui-with-custom-addons/src/lib/graceful-storage.ts new file mode 100644 index 0000000..4bb8f58 --- /dev/null +++ b/samples/screenshare-focused-ui-with-custom-addons/src/lib/graceful-storage.ts @@ -0,0 +1,21 @@ +const handler = { + get: + (target: any, name: any, receiver: any) => + (...args: any[]) => { + try { + return Reflect.get(target, name, receiver).apply(target, args); + } catch { + return null; + } + }, +}; + +let gracefulStorage: Storage; + +try { + gracefulStorage = new Proxy(localStorage, handler); +} catch { + gracefulStorage = new Proxy({}, handler); +} + +export default gracefulStorage; diff --git a/samples/screenshare-focused-ui-with-custom-addons/src/lib/store.ts b/samples/screenshare-focused-ui-with-custom-addons/src/lib/store.ts new file mode 100644 index 0000000..3a9b6c6 --- /dev/null +++ b/samples/screenshare-focused-ui-with-custom-addons/src/lib/store.ts @@ -0,0 +1,55 @@ +import create from 'zustand'; +import { persist } from 'zustand/middleware'; +import gracefulStorage from './graceful-storage'; + +export interface DyteStore { + displayName: string; + clientSpecificId: string; + audioTranscriptions: boolean; + presets: { name: string; id: string }[]; + effects: { + audio: { + krisp: boolean; + }; + video: { + background: 'none' | 'blur' | 'image'; + backgroundImage: string; + }; + }; + updateStore: (key: T, value: DyteStore[T]) => void; +} + +export const useDyteStore = create( + persist( + (set, get) => ({ + displayName: '', + clientSpecificId: Math.random().toString(36).substring(7), + audioTranscriptions: false, + presets: [], + effects: { + audio: { + krisp: false, + }, + video: { + background: 'none', + backgroundImage: '', + }, + }, + updateStore: (key, value) => { + set((state) => Object.assign({}, state, { [key]: value })); + }, + }), + { + name: 'dyte-store', + getStorage: () => gracefulStorage, + } + ) +); + +export const storeSelector = (store: DyteStore) => ({ + clientSpecificId: store.clientSpecificId, + displayName: store.displayName, + presets: store.presets, + effects: store.effects, + updateStore: store.updateStore, +}); diff --git a/samples/screenshare-focused-ui-with-custom-addons/src/main.tsx b/samples/screenshare-focused-ui-with-custom-addons/src/main.tsx new file mode 100644 index 0000000..87df32d --- /dev/null +++ b/samples/screenshare-focused-ui-with-custom-addons/src/main.tsx @@ -0,0 +1,9 @@ +import ReactDOM from 'react-dom/client'; +import App from './App'; +import './index.css'; + +ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( + // NOTE: Not using StrictMode to avoid the double execution of useEffect + // while trying out the sample + +); diff --git a/samples/screenshare-focused-ui-with-custom-addons/src/types.tsx b/samples/screenshare-focused-ui-with-custom-addons/src/types.tsx new file mode 100644 index 0000000..a09cdbd --- /dev/null +++ b/samples/screenshare-focused-ui-with-custom-addons/src/types.tsx @@ -0,0 +1,8 @@ +import type { States } from "@dytesdk/ui-kit"; +import { DyteSidebarSection } from "@dytesdk/ui-kit/dist/types/components/dyte-sidebar/dyte-sidebar"; + +export type CustomSideBarTabs = DyteSidebarSection | 'warnings'; + +export type CustomStates = States & { activeMediaPreviewModal?: boolean, customSidebar?: CustomSideBarTabs } + +export type SetStates = React.Dispatch>; \ No newline at end of file diff --git a/samples/screenshare-focused-ui-with-custom-addons/src/utils.ts b/samples/screenshare-focused-ui-with-custom-addons/src/utils.ts new file mode 100644 index 0000000..a86f519 --- /dev/null +++ b/samples/screenshare-focused-ui-with-custom-addons/src/utils.ts @@ -0,0 +1,21 @@ +import { UIConfig } from "@dytesdk/ui-kit"; + +export function setFullScreenToggleTargetElement({config, targetElementId}: { config: UIConfig, targetElementId: string }){ + if (config.root && Array.isArray(config.root['div#controlbar-left'])) { + const fullScreenToggleIndex = config.root['div#controlbar-left'].indexOf('dyte-fullscreen-toggle'); + if(fullScreenToggleIndex > -1){ + config.root['div#controlbar-left'][fullScreenToggleIndex] = ['dyte-fullscreen-toggle', { + variant: 'vertical', + targetElement: document.querySelector(`#${targetElementId}`), + }]; + } + } + ['dyte-more-toggle.activeMoreMenu', 'dyte-more-toggle.activeMoreMenu.md', 'dyte-more-toggle.activeMoreMenu.sm'].forEach((configElemKey) => { + const configElem = config?.root?.[configElemKey] as any; + configElem?.forEach((dyteElemConfigSet: any) => { + if (dyteElemConfigSet[0] === 'dyte-fullscreen-toggle') { + dyteElemConfigSet[1].targetElement = document.querySelector(`#${targetElementId}`); + } + }); + }); +} \ No newline at end of file diff --git a/samples/screenshare-focused-ui-with-custom-addons/src/vite-env.d.ts b/samples/screenshare-focused-ui-with-custom-addons/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/samples/screenshare-focused-ui-with-custom-addons/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/samples/screenshare-focused-ui-with-custom-addons/tailwind.config.js b/samples/screenshare-focused-ui-with-custom-addons/tailwind.config.js new file mode 100644 index 0000000..9e92a2d --- /dev/null +++ b/samples/screenshare-focused-ui-with-custom-addons/tailwind.config.js @@ -0,0 +1,8 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: ['./src/**/*.tsx'], + theme: { + extend: {}, + }, + plugins: [], +} diff --git a/samples/screenshare-focused-ui-with-custom-addons/tsconfig.json b/samples/screenshare-focused-ui-with-custom-addons/tsconfig.json new file mode 100644 index 0000000..3d0a51a --- /dev/null +++ b/samples/screenshare-focused-ui-with-custom-addons/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "allowJs": false, + "skipLibCheck": true, + "esModuleInterop": false, + "allowSyntheticDefaultImports": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "module": "ESNext", + "moduleResolution": "Node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx" + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/samples/screenshare-focused-ui-with-custom-addons/tsconfig.node.json b/samples/screenshare-focused-ui-with-custom-addons/tsconfig.node.json new file mode 100644 index 0000000..9d31e2a --- /dev/null +++ b/samples/screenshare-focused-ui-with-custom-addons/tsconfig.node.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + "composite": true, + "module": "ESNext", + "moduleResolution": "Node", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/samples/screenshare-focused-ui-with-custom-addons/vite.config.ts b/samples/screenshare-focused-ui-with-custom-addons/vite.config.ts new file mode 100644 index 0000000..50cc0f7 --- /dev/null +++ b/samples/screenshare-focused-ui-with-custom-addons/vite.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; + +// https://vitejs.dev/config/ +export default defineConfig({ + base:'./', + plugins: [react()], +});