From 596b920484761c0d5c7dd5307e09b5edfd3b6b81 Mon Sep 17 00:00:00 2001 From: Koper Date: Tue, 11 Jul 2023 18:40:11 +0700 Subject: [PATCH 01/41] Initial commit from Create Next App --- .gitignore | 35 ++ README.md | 34 ++ app/favicon.ico | Bin 0 -> 25931 bytes app/globals.css | 27 + app/layout.js | 17 + app/page.js | 113 ++++ jsconfig.json | 7 + next.config.js | 4 + package-lock.json | 1410 ++++++++++++++++++++++++++++++++++++++++++++ package.json | 19 + postcss.config.js | 6 + public/next.svg | 1 + public/vercel.svg | 1 + tailwind.config.js | 18 + 14 files changed, 1692 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 app/favicon.ico create mode 100644 app/globals.css create mode 100644 app/layout.js create mode 100644 app/page.js create mode 100644 jsconfig.json create mode 100644 next.config.js create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 postcss.config.js create mode 100644 public/next.svg create mode 100644 public/vercel.svg create mode 100644 tailwind.config.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..8f322f0d --- /dev/null +++ b/.gitignore @@ -0,0 +1,35 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# local env files +.env*.local + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/README.md b/README.md new file mode 100644 index 00000000..e5f733ef --- /dev/null +++ b/README.md @@ -0,0 +1,34 @@ +This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). + +## Getting Started + +First, run the development server: + +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +``` + +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. + +You can start editing the page by modifying `app/page.js`. The page auto-updates as you edit the file. + +This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. + +## Learn More + +To learn more about Next.js, take a look at the following resources: + +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. + +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! + +## Deploy on Vercel + +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. + +Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. diff --git a/app/favicon.ico b/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..718d6fea4835ec2d246af9800eddb7ffb276240c GIT binary patch literal 25931 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 LrJugUA?W`A8`#=m literal 0 HcmV?d00001 diff --git a/app/globals.css b/app/globals.css new file mode 100644 index 00000000..fd81e885 --- /dev/null +++ b/app/globals.css @@ -0,0 +1,27 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +:root { + --foreground-rgb: 0, 0, 0; + --background-start-rgb: 214, 219, 220; + --background-end-rgb: 255, 255, 255; +} + +@media (prefers-color-scheme: dark) { + :root { + --foreground-rgb: 255, 255, 255; + --background-start-rgb: 0, 0, 0; + --background-end-rgb: 0, 0, 0; + } +} + +body { + color: rgb(var(--foreground-rgb)); + background: linear-gradient( + to bottom, + transparent, + rgb(var(--background-end-rgb)) + ) + rgb(var(--background-start-rgb)); +} diff --git a/app/layout.js b/app/layout.js new file mode 100644 index 00000000..c93f8061 --- /dev/null +++ b/app/layout.js @@ -0,0 +1,17 @@ +import './globals.css' +import { Inter } from 'next/font/google' + +const inter = Inter({ subsets: ['latin'] }) + +export const metadata = { + title: 'Create Next App', + description: 'Generated by create next app', +} + +export default function RootLayout({ children }) { + return ( + + {children} + + ) +} diff --git a/app/page.js b/app/page.js new file mode 100644 index 00000000..533ec19e --- /dev/null +++ b/app/page.js @@ -0,0 +1,113 @@ +import Image from 'next/image' + +export default function Home() { + return ( +
+
+

+ Get started by editing  + app/page.js +

+ +
+ +
+ Next.js Logo +
+ + +
+ ) +} diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 00000000..2a2e4b3b --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "paths": { + "@/*": ["./*"] + } + } +} diff --git a/next.config.js b/next.config.js new file mode 100644 index 00000000..767719fc --- /dev/null +++ b/next.config.js @@ -0,0 +1,4 @@ +/** @type {import('next').NextConfig} */ +const nextConfig = {} + +module.exports = nextConfig diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..3af0142e --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1410 @@ +{ + "name": "reflector-ui", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "reflector-ui", + "version": "0.1.0", + "dependencies": { + "autoprefixer": "10.4.14", + "next": "13.4.9", + "postcss": "8.4.25", + "react": "18.2.0", + "react-dom": "18.2.0", + "tailwindcss": "3.3.2" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "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==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "node_modules/@next/env": { + "version": "13.4.9", + "resolved": "https://registry.npmjs.org/@next/env/-/env-13.4.9.tgz", + "integrity": "sha512-vuDRK05BOKfmoBYLNi2cujG2jrYbEod/ubSSyqgmEx9n/W3eZaJQdRNhTfumO+qmq/QTzLurW487n/PM/fHOkw==" + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "13.4.9", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.9.tgz", + "integrity": "sha512-TVzGHpZoVBk3iDsTOQA/R6MGmFp0+17SWXMEWd6zG30AfuELmSSMe2SdPqxwXU0gbpWkJL1KgfLzy5ReN0crqQ==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "13.4.9", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.9.tgz", + "integrity": "sha512-aSfF1fhv28N2e7vrDZ6zOQ+IIthocfaxuMWGReB5GDriF0caTqtHttAvzOMgJgXQtQx6XhyaJMozLTSEXeNN+A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "13.4.9", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.9.tgz", + "integrity": "sha512-JhKoX5ECzYoTVyIy/7KykeO4Z2lVKq7HGQqvAH+Ip9UFn1MOJkOnkPRB7v4nmzqAoY+Je05Aj5wNABR1N18DMg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "13.4.9", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.9.tgz", + "integrity": "sha512-OOn6zZBIVkm/4j5gkPdGn4yqQt+gmXaLaSjRSO434WplV8vo2YaBNbSHaTM9wJpZTHVDYyjzuIYVEzy9/5RVZw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "13.4.9", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.9.tgz", + "integrity": "sha512-iA+fJXFPpW0SwGmx/pivVU+2t4zQHNOOAr5T378PfxPHY6JtjV6/0s1vlAJUdIHeVpX98CLp9k5VuKgxiRHUpg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "13.4.9", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.9.tgz", + "integrity": "sha512-rlNf2WUtMM+GAQrZ9gMNdSapkVi3koSW3a+dmBVp42lfugWVvnyzca/xJlN48/7AGx8qu62WyO0ya1ikgOxh6A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "13.4.9", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.9.tgz", + "integrity": "sha512-5T9ybSugXP77nw03vlgKZxD99AFTHaX8eT1ayKYYnGO9nmYhJjRPxcjU5FyYI+TdkQgEpIcH7p/guPLPR0EbKA==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "13.4.9", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.9.tgz", + "integrity": "sha512-ojZTCt1lP2ucgpoiFgrFj07uq4CZsq4crVXpLGgQfoFq00jPKRPgesuGPaz8lg1yLfvafkU3Jd1i8snKwYR3LA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "13.4.9", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.9.tgz", + "integrity": "sha512-QbT03FXRNdpuL+e9pLnu+XajZdm/TtIXVYY4lA9t+9l0fLZbHXDYEKitAqxrOj37o3Vx5ufxiRAniaIebYDCgw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "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==", + "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==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@swc/helpers": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz", + "integrity": "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "node_modules/autoprefixer": { + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], + "dependencies": { + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", + "fraction.js": "^4.2.0", + "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/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "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.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "node_modules/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==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001515", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001515.tgz", + "integrity": "sha512-eEFDwUOZbE24sb+Ecsx3+OvNETqjWIdabMy52oOkIgcUtAsQifjUG9q4U9dgTHJM2mfk4uEPxc0+xuFdJ629QA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "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" + }, + "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==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "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==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.455", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.455.tgz", + "integrity": "sha512-8tgdX0Odl24LtmLwxotpJCVjIndN559AvaOtd67u+2mo+IDsgsTF580NB+uuDCqsHw8yFg53l5+imFV9Fw3cbA==" + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-glob": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", + "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "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==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "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==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/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==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dependencies": { + "has": "^1.0.3" + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "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==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jiti": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.19.1.tgz", + "integrity": "sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==", + "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/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "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==" + }, + "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/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "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==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "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/next": { + "version": "13.4.9", + "resolved": "https://registry.npmjs.org/next/-/next-13.4.9.tgz", + "integrity": "sha512-vtefFm/BWIi/eWOqf1GsmKG3cjKw1k3LjuefKRcL3iiLl3zWzFdPG3as6xtxrGO6gwTzzaO1ktL4oiHt/uvTjA==", + "dependencies": { + "@next/env": "13.4.9", + "@swc/helpers": "0.5.1", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001406", + "postcss": "8.4.14", + "styled-jsx": "5.1.1", + "watchpack": "2.4.0", + "zod": "3.21.4" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=16.8.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "13.4.9", + "@next/swc-darwin-x64": "13.4.9", + "@next/swc-linux-arm64-gnu": "13.4.9", + "@next/swc-linux-arm64-musl": "13.4.9", + "@next/swc-linux-x64-gnu": "13.4.9", + "@next/swc-linux-x64-musl": "13.4.9", + "@next/swc-win32-arm64-msvc": "13.4.9", + "@next/swc-win32-ia32-msvc": "13.4.9", + "@next/swc-win32-x64-msvc": "13.4.9" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "fibers": ">= 3.1.0", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "fibers": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.14", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", + "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + ], + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "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==", + "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==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.4.25", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.25.tgz", + "integrity": "sha512-7taJ/8t2av0Z+sQEvNzCkpDynl0tX3uJMCODi6nT3PfASC7dYCWV9aQ+uiCf+KBD4SEFcu+GvJdGdwzQ6OSjCw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/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==", + "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==", + "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.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + }, + "engines": { + "node": ">= 14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "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==", + "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.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "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==" + }, + "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.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.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==", + "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==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dependencies": { + "is-core-module": "^2.11.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==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "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==", + "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.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", + "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/sucrase": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.32.0.tgz", + "integrity": "sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "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": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.2.tgz", + "integrity": "sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==", + "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.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.18.2", + "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", + "postcss-value-parser": "^4.2.0", + "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==", + "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==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "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==" + }, + "node_modules/tslib": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "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.1", + "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==" + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/yaml": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/zod": { + "version": "3.21.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", + "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..34561cd4 --- /dev/null +++ b/package.json @@ -0,0 +1,19 @@ +{ + "name": "reflector-ui", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint" + }, + "dependencies": { + "autoprefixer": "10.4.14", + "next": "13.4.9", + "postcss": "8.4.25", + "react": "18.2.0", + "react-dom": "18.2.0", + "tailwindcss": "3.3.2" + } +} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 00000000..33ad091d --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/public/next.svg b/public/next.svg new file mode 100644 index 00000000..5174b28c --- /dev/null +++ b/public/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/vercel.svg b/public/vercel.svg new file mode 100644 index 00000000..d2f84222 --- /dev/null +++ b/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 00000000..8c4d1b21 --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,18 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: [ + './pages/**/*.{js,ts,jsx,tsx,mdx}', + './components/**/*.{js,ts,jsx,tsx,mdx}', + './app/**/*.{js,ts,jsx,tsx,mdx}', + ], + theme: { + extend: { + backgroundImage: { + 'gradient-radial': 'radial-gradient(var(--tw-gradient-stops))', + 'gradient-conic': + 'conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))', + }, + }, + }, + plugins: [], +} From a3802d054c186a36e7f1c5a998e3529975d31676 Mon Sep 17 00:00:00 2001 From: Koper Date: Tue, 18 Jul 2023 11:50:11 +0700 Subject: [PATCH 02/41] Initial commit --- app/components/audioVisualizer.js | 55 +++++++++ app/components/dashboard.js | 114 ++++++++++++++++++ app/components/record.js | 46 ++++++++ app/components/webrtc.js | 36 ++++++ app/globals.css | 2 + app/layout.js | 15 ++- app/page.js | 143 ++++++---------------- app/utils.js | 21 ++++ package-lock.json | 189 +++++++++++++++++++++++++++++- package.json | 10 +- 10 files changed, 509 insertions(+), 122 deletions(-) create mode 100644 app/components/audioVisualizer.js create mode 100644 app/components/dashboard.js create mode 100644 app/components/record.js create mode 100644 app/components/webrtc.js create mode 100644 app/utils.js diff --git a/app/components/audioVisualizer.js b/app/components/audioVisualizer.js new file mode 100644 index 00000000..bf541f42 --- /dev/null +++ b/app/components/audioVisualizer.js @@ -0,0 +1,55 @@ +import React, { useRef, useEffect } from 'react'; + +function AudioVisualizer() { + const canvasRef = useRef(null); + + useEffect(() => { + let animationFrameId; + + const canvas = canvasRef.current; + const context = canvas.getContext('2d'); + const analyser = new AnalyserNode(new AudioContext()); + + navigator.mediaDevices.getUserMedia({ audio: true }) + .then(stream => { + const audioContext = new (window.AudioContext || window.webkitAudioContext)(); + const source = audioContext.createMediaStreamSource(stream); + const analyser = audioContext.createAnalyser(); + analyser.fftSize = 2048; + source.connect(analyser); + + const bufferLength = analyser.frequencyBinCount; + const dataArray = new Uint8Array(bufferLength); + const barWidth = (canvas.width / bufferLength) * 2.5; + let barHeight; + let x = 0; + + function renderFrame() { + x = 0; + analyser.getByteFrequencyData(dataArray); + context.fillStyle = '#000'; + context.fillRect(0, 0, canvas.width, canvas.height); + for (let i = 0; i < bufferLength; i++) { + barHeight = dataArray[i]; + + const red = 255; + const green = 250 * (i / bufferLength); + const blue = barHeight + (25 * (i / bufferLength)); + + context.fillStyle = `rgb(${red},${green},${blue})`; + context.fillRect(x, canvas.height - barHeight / 2, barWidth, barHeight / 2); + + x += barWidth + 1; + } + animationFrameId = requestAnimationFrame(renderFrame); + } + renderFrame(); + }); + + return () => cancelAnimationFrame(animationFrameId); + }, []); + + return ; +} + +export default AudioVisualizer; diff --git a/app/components/dashboard.js b/app/components/dashboard.js new file mode 100644 index 00000000..2454e71b --- /dev/null +++ b/app/components/dashboard.js @@ -0,0 +1,114 @@ +import { Mulberry32 } from '../utils.js' +import React, { useState, useEffect } from 'react'; +import AudioVisualizer from './audioVisualizer.js'; + +export function Dashboard() +{ + const [openIndex, setOpenIndex] = useState(null); + const [liveTranscript, setLiveTranscript] = useState(""); + + const [fakeTranscriptIndex, setFakeTranscriptIndex] = useState(0); + + const fakeTranscripts = [ + "This is the first transcript. We are discussing the current situation of our company. We are currently leading the market with a significant margin, and our future outlook is also very promising...", + "Here is the second transcript. We are now moving to our next topic, which is the progress in our ongoing projects. Most of them are on schedule and the quality of work is up to our standard...", + "This is the third transcript. It's about the financial status of our company. We are doing quite well financially. The revenue for this quarter is higher than expected...", + // add more fake transcripts as needed + ]; + + useEffect(() => { + // Randomly select a fake transcript + const selectedTranscript = fakeTranscripts[Math.floor(Math.random() * fakeTranscripts.length)]; + // Split the selected transcript into characters + const characters = Array.from(selectedTranscript); + + let counter = 0; + let liveTranscriptCopy = ''; + let intervalId = setInterval(() => { + if (counter < characters.length) { + liveTranscriptCopy += characters[counter]; + setLiveTranscript(liveTranscriptCopy); + counter++; + } else { + clearInterval(intervalId); + } + }, 50); // delay of 100ms + + // Cleanup function to clear the interval when the component unmounts + return () => clearInterval(intervalId); + }, []); + + const generateDecibelData = (x) => { + let data = []; + let random = Mulberry32(123456789 + x); + for (let i = 0; i < 50; i++) { + data.push(Math.floor(random() * 30) + 10); // generate random values between 10 and 40 + } + return data; + }; + const generateDecibelGraph = (decibelData) => { + return decibelData.map((decibel, i) => ( +
 
+ )); + }; + + + // This is hardcoded data for proof of concept + const data = [ + { timestamp: '00:00', topic: 'Meeting Introduction', decibel: generateDecibelData(1), transcript: "This is the meeting introduction, we will be discussing several important topics today." }, + { timestamp: '00:48', topic: 'Discussing Quarterly Revenue', decibel: generateDecibelData(2), transcript: "We are discussing the quarterly revenue here, it appears our revenue has grown by 15% compared to the previous quarter." }, + { timestamp: '01:35', topic: 'Annual Sales Review', decibel: generateDecibelData(3), transcript: "Now we're reviewing the annual sales, there was a significant boost during the holiday season." }, + { timestamp: '02:20', topic: 'Operational Costs Analysis', decibel: generateDecibelData(4), transcript: "Moving on to the operational costs analysis, we have managed to reduce unnecessary expenses." }, + { timestamp: '03:10', topic: 'Employee Performance', decibel: generateDecibelData(5), transcript: "Let's talk about the employee performance, overall the team has done a great job." }, +/* { timestamp: '03:45', topic: 'New Marketing Strategies', decibel: generateDecibelData(6), transcript: "Our marketing team has proposed some new strategies that we'll discuss now." }, + { timestamp: '04:30', topic: 'Customer Feedback', decibel: generateDecibelData(7), transcript: "Let's go through some customer feedback that we've received." }, + { timestamp: '05:15', topic: 'Product Development', decibel: generateDecibelData(8), transcript: "Product development is going well and the new product line will be ready to launch next quarter." }, + { timestamp: '06:00', topic: 'Discussing Future Projects', decibel: generateDecibelData(9), transcript: "Now we are talking about the future projects, we have some exciting projects lined up." }, + { timestamp: '06:45', topic: 'Meeting Conclusion', decibel: generateDecibelData(10), transcript: "As we conclude the meeting, I want to thank everyone for their hard work and dedication." }, */ + ]; + + return ( + <> +
+
+

Reflector

+

Capture The Signal, Not The Noise

+
+
+
Timestamp
+
Topic
+
+
+ {data.map((item, index) => ( +
+
setOpenIndex(openIndex === index ? null : index)}> +
{item.timestamp}
+
{item.topic} {'>'}
+
+ {generateDecibelGraph(item.decibel)} +
+
+ {openIndex === index && ( +
+ {item.transcript} +
+ )} +
+ ))} +
+
+
Live
+
Transcript
+
+ {generateDecibelGraph(generateDecibelData())} +
+
+
+ {liveTranscript} +
+
+ +
+ +); +}; diff --git a/app/components/record.js b/app/components/record.js new file mode 100644 index 00000000..f6af74ca --- /dev/null +++ b/app/components/record.js @@ -0,0 +1,46 @@ +export default function Record(props) { + let mediaRecorder = null; // mediaRecorder instance + + const startRecording = () => { + navigator.mediaDevices.getUserMedia({ audio: true }) + .then(stream => { + mediaRecorder = new MediaRecorder(stream); + mediaRecorder.start(); + props.onRecord(true); + }); + }; + + const stopRecording = () => { + if (mediaRecorder) { + mediaRecorder.stop(); + props.onRecord(false); + } + }; + + return ( +
+
+

Reflector

+

Capture The Signal, Not The Noise

+
+ +
+ {!props.isRecording ? ( + + ) : ( + + )} +
+
+ ) +} diff --git a/app/components/webrtc.js b/app/components/webrtc.js new file mode 100644 index 00000000..26612904 --- /dev/null +++ b/app/components/webrtc.js @@ -0,0 +1,36 @@ +import { useEffect, useState } from 'react'; +import Peer from 'simple-peer'; + +const useWebRTC = (stream) => { + const [data, setData] = useState(null); + + useEffect(() => { + let peer = new Peer({ initiator: true, stream: stream }); + + peer.on('signal', data => { + // This is where you'd send the signal data to the server. + // The server would then send it back to other peers who would then + // use `peer.signal()` method to continue the connection negotiation. + console.log('signal', data); + }); + + peer.on('connect', () => { + console.log('WebRTC connected'); + }); + + peer.on('data', data => { + // Received data from the server. + const serverData = JSON.parse(data.toString()); + setData(serverData); + }); + + // Clean up + return () => { + peer.destroy(); + } + }, [stream]); + + return data; +}; + +export default useWebRTC; diff --git a/app/globals.css b/app/globals.css index fd81e885..9e075856 100644 --- a/app/globals.css +++ b/app/globals.css @@ -24,4 +24,6 @@ body { rgb(var(--background-end-rgb)) ) rgb(var(--background-start-rgb)); + + font-family: 'Roboto', sans-serif; } diff --git a/app/layout.js b/app/layout.js index c93f8061..88b9c340 100644 --- a/app/layout.js +++ b/app/layout.js @@ -1,17 +1,22 @@ import './globals.css' -import { Inter } from 'next/font/google' +import { Roboto } from 'next/font/google' -const inter = Inter({ subsets: ['latin'] }) +import Head from 'next/head' + +const roboto = Roboto({ subsets: ['latin'], weight: '400' }) export const metadata = { - title: 'Create Next App', - description: 'Generated by create next app', + title: 'Reflector – Monadical', + description: 'Capture The Signal, Not The Noise', } export default function RootLayout({ children }) { return ( - {children} + + Test + + {children} ) } diff --git a/app/page.js b/app/page.js index 533ec19e..4aafb260 100644 --- a/app/page.js +++ b/app/page.js @@ -1,113 +1,38 @@ -import Image from 'next/image' +"use client" +import React, { useState, useEffect } from 'react'; +import Record from './components/record.js'; +import { Dashboard } from './components/dashboard.js'; +import useWebRTC from './components/webrtc.js'; -export default function Home() { - return ( -
-
-

- Get started by editing  - app/page.js -

- +const App = () => { + const [isRecording, setIsRecording] = useState(false); + const [splashScreen, setSplashScreen] = useState(true); + + + + const handleRecord = (recording) => { + setIsRecording(recording); + setSplashScreen(false); + }; + + const [stream, setStream] = useState(null); + const serverData = useWebRTC(stream); + console.log(serverData); + + useEffect(() => { + navigator.mediaDevices.getUserMedia({ audio: true }) + .then(setStream) + .catch(err => console.error(err)); + }, []); + + return ( +
+ {splashScreen && handleRecord(recording)} /> } + {!splashScreen && }
+ ); -
- Next.js Logo -
- - -
- ) } + + +export default App; \ No newline at end of file diff --git a/app/utils.js b/app/utils.js new file mode 100644 index 00000000..2e7d8e16 --- /dev/null +++ b/app/utils.js @@ -0,0 +1,21 @@ +export function getRandomNumber(min, max) { + return Math.floor(Math.random() * (max - min + 1)) + min; +} + +export function SeededRand(seed) { + seed ^= seed << 13 + seed ^= seed >> 17 + seed ^= seed << 5 + return seed / (2 ** 32) +} + + + +export function Mulberry32(seed) { + return function () { + var t = seed += 0x6D2B79F5; + t = Math.imul(t ^ t >>> 15, t | 1); + t ^= t + Math.imul(t ^ t >>> 7, t | 61); + return ((t ^ t >>> 14) >>> 0) / 4294967296; + } +} diff --git a/package-lock.json b/package-lock.json index 3af0142e..8826fd2f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,11 +9,13 @@ "version": "0.1.0", "dependencies": { "autoprefixer": "10.4.14", - "next": "13.4.9", + "next": "^13.4.9", "postcss": "8.4.25", - "react": "18.2.0", - "react-dom": "18.2.0", - "tailwindcss": "3.3.2" + "react": "^18.2.0", + "react-dom": "^18.2.0", + "simple-peer": "^9.11.1", + "supports-color": "^9.4.0", + "tailwindcss": "^3.3.2" } }, "node_modules/@alloc/quick-lru": { @@ -314,6 +316,25 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -373,6 +394,29 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/busboy": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", @@ -477,6 +521,22 @@ "node": ">=4" } }, + "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", @@ -492,6 +552,11 @@ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.455.tgz", "integrity": "sha512-8tgdX0Odl24LtmLwxotpJCVjIndN559AvaOtd67u+2mo+IDsgsTF580NB+uuDCqsHw8yFg53l5+imFV9Fw3cbA==" }, + "node_modules/err-code": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz", + "integrity": "sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==" + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -580,6 +645,11 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "node_modules/get-browser-rtc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-browser-rtc/-/get-browser-rtc-1.1.0.tgz", + "integrity": "sha512-MghbMJ61EJrRsDe7w1Bvqt3ZsBuqhce5nrn/XAwgwOXhcsz53/ltdxOse1h/8eKXj5slzxdsz56g5rzOFSGwfQ==" + }, "node_modules/glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", @@ -631,6 +701,25 @@ "node": ">= 0.4.0" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -762,6 +851,11 @@ "node": "*" } }, + "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", @@ -1095,6 +1189,14 @@ } ] }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, "node_modules/react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", @@ -1126,6 +1228,19 @@ "pify": "^2.3.0" } }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -1184,6 +1299,25 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/scheduler": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", @@ -1192,6 +1326,34 @@ "loose-envify": "^1.1.0" } }, + "node_modules/simple-peer": { + "version": "9.11.1", + "resolved": "https://registry.npmjs.org/simple-peer/-/simple-peer-9.11.1.tgz", + "integrity": "sha512-D1SaWpOW8afq1CZGWB8xTfrT3FekjQmPValrqncJMX7QFl8YwhrPTZvMCANLtgBwwdS+7zURyqxDDEmY558tTw==", + "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": { + "buffer": "^6.0.3", + "debug": "^4.3.2", + "err-code": "^3.0.1", + "get-browser-rtc": "^1.1.0", + "queue-microtask": "^1.2.3", + "randombytes": "^2.1.0", + "readable-stream": "^3.6.0" + } + }, "node_modules/source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", @@ -1208,6 +1370,14 @@ "node": ">=10.0.0" } }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/styled-jsx": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", @@ -1251,6 +1421,17 @@ "node": ">=8" } }, + "node_modules/supports-color": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", + "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, "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", diff --git a/package.json b/package.json index 34561cd4..aab669ed 100644 --- a/package.json +++ b/package.json @@ -10,10 +10,12 @@ }, "dependencies": { "autoprefixer": "10.4.14", - "next": "13.4.9", + "next": "^13.4.9", "postcss": "8.4.25", - "react": "18.2.0", - "react-dom": "18.2.0", - "tailwindcss": "3.3.2" + "react": "^18.2.0", + "react-dom": "^18.2.0", + "simple-peer": "^9.11.1", + "supports-color": "^9.4.0", + "tailwindcss": "^3.3.2" } } From 9e8eea12dc894e294a67547fb416a67b93ad2347 Mon Sep 17 00:00:00 2001 From: Koper Date: Tue, 18 Jul 2023 11:54:39 +0700 Subject: [PATCH 03/41] Update README.md --- README.md | 75 ++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 57 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index e5f733ef..3c5a9ef5 100644 --- a/README.md +++ b/README.md @@ -1,34 +1,73 @@ -This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). +# Reflector React App -## Getting Started +Reflector is a React application that uses WebRTC to stream audio from the browser to a server and receive live transcription and topics from the server. -First, run the development server: +## Table of Contents + +- [Reflector React App](#reflector-react-app) + - [Table of Contents](#table-of-contents) + - [Installation](#installation) + - [Run the Application](#run-the-application) + - [WebRTC Integration](#webrtc-integration) + - [Contribution Guidelines](#contribution-guidelines) + +## Installation + +To install the application, run: + +```bash +npm install +``` + +## Run the Application + +To run the application in development mode, run: ```bash npm run dev -# or -yarn dev -# or -pnpm dev ``` -Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. +Then open [http://localhost:3000](http://localhost:3000) to view it in the browser. -You can start editing the page by modifying `app/page.js`. The page auto-updates as you edit the file. +## WebRTC Integration -This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. +The main part of the WebRTC integration is located in the `useWebRTC` hook in the `hooks/useWebRTC.js` file. This hook initiates a WebRTC connection when an audio stream is available, sends signal data to the server, and listens for data from the server. -## Learn More +To connect the application with your server, you need to implement the following: -To learn more about Next.js, take a look at the following resources: +1. **Signal Data Sending**: In the `useWebRTC` hook, when a `'signal'` event is emitted, the hook logs the signal data to the console. You should replace this logging with sending the data to the server: -- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. -- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. +```jsx +peer.on('signal', data => { + // This is where you send the signal data to the server. +}); +``` -You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! +2. **Data Receiving**: The `useWebRTC` hook listens for `'data'` event and when it is emitted, it sets the received data to the `data` state: -## Deploy on Vercel +```jsx +peer.on('data', data => { + // Received data from the server. + const serverData = JSON.parse(data.toString()); + setData(serverData); +}); +``` -The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. +The received data is expected to be a JSON object containing the live transcription and topics: -Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. +```json +{ + "transcription": "live transcription...", + "topics": [ + { "title": "topic 1", "description": "description 1" }, + { "title": "topic 2", "description": "description 2" }, + // ... + ] +} +``` + +This data is then returned from the `useWebRTC` hook and can be used in your components. + +## Contribution Guidelines + +All new contributions should be made to the `development` branch. Before any code is merged into `master`, it requires a code review by Andreas. From 244e8123d175f75d4d3649f9494deb04d37956cc Mon Sep 17 00:00:00 2001 From: Koper Date: Tue, 18 Jul 2023 11:55:08 +0700 Subject: [PATCH 04/41] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3c5a9ef5..ed16ca96 100644 --- a/README.md +++ b/README.md @@ -70,4 +70,4 @@ This data is then returned from the `useWebRTC` hook and can be used in your com ## Contribution Guidelines -All new contributions should be made to the `development` branch. Before any code is merged into `master`, it requires a code review by Andreas. +All new contributions should be made in a separate branch. Before any code is merged into `master`, it requires a code review by Andreas. From dc0750f17814bd7b25615e43ce4c6f3efc78534d Mon Sep 17 00:00:00 2001 From: Koper Date: Tue, 18 Jul 2023 12:53:19 +0700 Subject: [PATCH 05/41] Create TIMELINE.md --- TIMELINE.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 TIMELINE.md diff --git a/TIMELINE.md b/TIMELINE.md new file mode 100644 index 00000000..95fd6d66 --- /dev/null +++ b/TIMELINE.md @@ -0,0 +1,12 @@ +# Project Timeline + +Here's a structured timeline for our project completion: + +| Day | Objective | +| --------- | -------------------------------------------------------- | +| Tuesday | Front-end and Back-end integration | +| Wednesday | Project will be polished and tested by Adam | +| Thursday | Project completion. Additional tests will be performed | +| Friday | Big demo presentation | + +Let's stay focused and get our tasks done on time for a successful demo on Friday. Let's have a successful week! From 21aec04008dde0f8d24b15a49360607a540c87aa Mon Sep 17 00:00:00 2001 From: Koper Date: Tue, 18 Jul 2023 15:45:01 +0700 Subject: [PATCH 06/41] ADditional features --- app/components/audioVisualizer.js | 9 +++++++-- app/components/dashboard.js | 12 ++++++++++-- app/page.js | 25 ++++++++++++++++++------- 3 files changed, 35 insertions(+), 11 deletions(-) diff --git a/app/components/audioVisualizer.js b/app/components/audioVisualizer.js index bf541f42..eaf19e00 100644 --- a/app/components/audioVisualizer.js +++ b/app/components/audioVisualizer.js @@ -1,6 +1,6 @@ import React, { useRef, useEffect } from 'react'; -function AudioVisualizer() { +function AudioVisualizer(props) { const canvasRef = useRef(null); useEffect(() => { @@ -29,6 +29,8 @@ function AudioVisualizer() { analyser.getByteFrequencyData(dataArray); context.fillStyle = '#000'; context.fillRect(0, 0, canvas.width, canvas.height); + + for (let i = 0; i < bufferLength; i++) { barHeight = dataArray[i]; @@ -49,7 +51,10 @@ function AudioVisualizer() { return () => cancelAnimationFrame(animationFrameId); }, []); - return ; + return <> +

Is recording: {props.isRecording ? "true" : "false"}

+ + ; } export default AudioVisualizer; diff --git a/app/components/dashboard.js b/app/components/dashboard.js index 2454e71b..cbe74378 100644 --- a/app/components/dashboard.js +++ b/app/components/dashboard.js @@ -2,7 +2,7 @@ import { Mulberry32 } from '../utils.js' import React, { useState, useEffect } from 'react'; import AudioVisualizer from './audioVisualizer.js'; -export function Dashboard() +export function Dashboard(props) { const [openIndex, setOpenIndex] = useState(null); const [liveTranscript, setLiveTranscript] = useState(""); @@ -107,7 +107,15 @@ export function Dashboard() {liveTranscript} - + + + + ); diff --git a/app/page.js b/app/page.js index 4aafb260..0a26d0ce 100644 --- a/app/page.js +++ b/app/page.js @@ -11,24 +11,35 @@ const App = () => { const handleRecord = (recording) => { + console.log("handleRecord", recording); + setIsRecording(recording); setSplashScreen(false); + + if (recording) + { + navigator.mediaDevices.getUserMedia({ audio: true }) + .then(setStream) + .catch(err => console.error(err)); + } else if (!recording) { + if (stream) { + const tracks = stream.getTracks(); + tracks.forEach(track => track.stop()); + setStream(null); + } + + setIsRecording(false); + } }; const [stream, setStream] = useState(null); const serverData = useWebRTC(stream); console.log(serverData); - useEffect(() => { - navigator.mediaDevices.getUserMedia({ audio: true }) - .then(setStream) - .catch(err => console.error(err)); - }, []); - return (
{splashScreen && handleRecord(recording)} /> } - {!splashScreen && } + {!splashScreen && handleRecord(recording)} />}
); From 9382ab13aba7784113f249bb10cb731f31c86d13 Mon Sep 17 00:00:00 2001 From: Koper Date: Tue, 18 Jul 2023 15:52:39 +0700 Subject: [PATCH 07/41] yarn format --- README.md | 6 +- TIMELINE.md | 12 +- app/components/audioVisualizer.js | 94 ++-- app/components/dashboard.js | 256 +++++---- app/components/record.js | 79 ++- app/components/webrtc.js | 50 +- app/globals.css | 2 +- app/layout.js | 16 +- app/page.js | 54 +- app/utils.js | 24 +- next.config.js | 4 +- package.json | 10 +- postcss.config.js | 2 +- tailwind.config.js | 14 +- yarn.lock | 893 ++++++++++++++++++++++++++++++ 15 files changed, 1235 insertions(+), 281 deletions(-) create mode 100644 yarn.lock diff --git a/README.md b/README.md index ed16ca96..58b561c4 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ To connect the application with your server, you need to implement the following 1. **Signal Data Sending**: In the `useWebRTC` hook, when a `'signal'` event is emitted, the hook logs the signal data to the console. You should replace this logging with sending the data to the server: ```jsx -peer.on('signal', data => { +peer.on("signal", (data) => { // This is where you send the signal data to the server. }); ``` @@ -46,7 +46,7 @@ peer.on('signal', data => { 2. **Data Receiving**: The `useWebRTC` hook listens for `'data'` event and when it is emitted, it sets the received data to the `data` state: ```jsx -peer.on('data', data => { +peer.on("data", (data) => { // Received data from the server. const serverData = JSON.parse(data.toString()); setData(serverData); @@ -60,7 +60,7 @@ The received data is expected to be a JSON object containing the live transcript "transcription": "live transcription...", "topics": [ { "title": "topic 1", "description": "description 1" }, - { "title": "topic 2", "description": "description 2" }, + { "title": "topic 2", "description": "description 2" } // ... ] } diff --git a/TIMELINE.md b/TIMELINE.md index 95fd6d66..82007396 100644 --- a/TIMELINE.md +++ b/TIMELINE.md @@ -2,11 +2,11 @@ Here's a structured timeline for our project completion: -| Day | Objective | -| --------- | -------------------------------------------------------- | -| Tuesday | Front-end and Back-end integration | -| Wednesday | Project will be polished and tested by Adam | -| Thursday | Project completion. Additional tests will be performed | -| Friday | Big demo presentation | +| Day | Objective | +| --------- | ------------------------------------------------------ | +| Tuesday | Front-end and Back-end integration | +| Wednesday | Project will be polished and tested by Adam | +| Thursday | Project completion. Additional tests will be performed | +| Friday | Big demo presentation | Let's stay focused and get our tasks done on time for a successful demo on Friday. Let's have a successful week! diff --git a/app/components/audioVisualizer.js b/app/components/audioVisualizer.js index eaf19e00..12954d63 100644 --- a/app/components/audioVisualizer.js +++ b/app/components/audioVisualizer.js @@ -1,60 +1,66 @@ -import React, { useRef, useEffect } from 'react'; +import React, { useRef, useEffect } from "react"; function AudioVisualizer(props) { - const canvasRef = useRef(null); + const canvasRef = useRef(null); - useEffect(() => { - let animationFrameId; + useEffect(() => { + let animationFrameId; - const canvas = canvasRef.current; - const context = canvas.getContext('2d'); - const analyser = new AnalyserNode(new AudioContext()); + const canvas = canvasRef.current; + const context = canvas.getContext("2d"); + const analyser = new AnalyserNode(new AudioContext()); - navigator.mediaDevices.getUserMedia({ audio: true }) - .then(stream => { - const audioContext = new (window.AudioContext || window.webkitAudioContext)(); - const source = audioContext.createMediaStreamSource(stream); - const analyser = audioContext.createAnalyser(); - analyser.fftSize = 2048; - source.connect(analyser); + navigator.mediaDevices.getUserMedia({ audio: true }).then((stream) => { + const audioContext = new (window.AudioContext || + window.webkitAudioContext)(); + const source = audioContext.createMediaStreamSource(stream); + const analyser = audioContext.createAnalyser(); + analyser.fftSize = 2048; + source.connect(analyser); - const bufferLength = analyser.frequencyBinCount; - const dataArray = new Uint8Array(bufferLength); - const barWidth = (canvas.width / bufferLength) * 2.5; - let barHeight; - let x = 0; + const bufferLength = analyser.frequencyBinCount; + const dataArray = new Uint8Array(bufferLength); + const barWidth = (canvas.width / bufferLength) * 2.5; + let barHeight; + let x = 0; - function renderFrame() { - x = 0; - analyser.getByteFrequencyData(dataArray); - context.fillStyle = '#000'; - context.fillRect(0, 0, canvas.width, canvas.height); + function renderFrame() { + x = 0; + analyser.getByteFrequencyData(dataArray); + context.fillStyle = "#000"; + context.fillRect(0, 0, canvas.width, canvas.height); + for (let i = 0; i < bufferLength; i++) { + barHeight = dataArray[i]; - for (let i = 0; i < bufferLength; i++) { - barHeight = dataArray[i]; + const red = 255; + const green = 250 * (i / bufferLength); + const blue = barHeight + 25 * (i / bufferLength); - const red = 255; - const green = 250 * (i / bufferLength); - const blue = barHeight + (25 * (i / bufferLength)); + context.fillStyle = `rgb(${red},${green},${blue})`; + context.fillRect( + x, + canvas.height - barHeight / 2, + barWidth, + barHeight / 2, + ); - context.fillStyle = `rgb(${red},${green},${blue})`; - context.fillRect(x, canvas.height - barHeight / 2, barWidth, barHeight / 2); + x += barWidth + 1; + } + animationFrameId = requestAnimationFrame(renderFrame); + } + renderFrame(); + }); - x += barWidth + 1; - } - animationFrameId = requestAnimationFrame(renderFrame); - } - renderFrame(); - }); + return () => cancelAnimationFrame(animationFrameId); + }, []); - return () => cancelAnimationFrame(animationFrameId); - }, []); - - return <> -

Is recording: {props.isRecording ? "true" : "false"}

- - ; + return ( + <> +

Is recording: {props.isRecording ? "true" : "false"}

+ + + ); } export default AudioVisualizer; diff --git a/app/components/dashboard.js b/app/components/dashboard.js index cbe74378..ed92fb9a 100644 --- a/app/components/dashboard.js +++ b/app/components/dashboard.js @@ -1,122 +1,166 @@ -import { Mulberry32 } from '../utils.js' -import React, { useState, useEffect } from 'react'; -import AudioVisualizer from './audioVisualizer.js'; +import { Mulberry32 } from "../utils.js"; +import React, { useState, useEffect } from "react"; +import AudioVisualizer from "./audioVisualizer.js"; -export function Dashboard(props) -{ - const [openIndex, setOpenIndex] = useState(null); - const [liveTranscript, setLiveTranscript] = useState(""); +export function Dashboard(props) { + const [openIndex, setOpenIndex] = useState(null); + const [liveTranscript, setLiveTranscript] = useState(""); - const [fakeTranscriptIndex, setFakeTranscriptIndex] = useState(0); + const [fakeTranscriptIndex, setFakeTranscriptIndex] = useState(0); - const fakeTranscripts = [ - "This is the first transcript. We are discussing the current situation of our company. We are currently leading the market with a significant margin, and our future outlook is also very promising...", - "Here is the second transcript. We are now moving to our next topic, which is the progress in our ongoing projects. Most of them are on schedule and the quality of work is up to our standard...", - "This is the third transcript. It's about the financial status of our company. We are doing quite well financially. The revenue for this quarter is higher than expected...", - // add more fake transcripts as needed - ]; + const fakeTranscripts = [ + "This is the first transcript. We are discussing the current situation of our company. We are currently leading the market with a significant margin, and our future outlook is also very promising...", + "Here is the second transcript. We are now moving to our next topic, which is the progress in our ongoing projects. Most of them are on schedule and the quality of work is up to our standard...", + "This is the third transcript. It's about the financial status of our company. We are doing quite well financially. The revenue for this quarter is higher than expected...", + // add more fake transcripts as needed + ]; - useEffect(() => { - // Randomly select a fake transcript - const selectedTranscript = fakeTranscripts[Math.floor(Math.random() * fakeTranscripts.length)]; - // Split the selected transcript into characters - const characters = Array.from(selectedTranscript); + useEffect(() => { + // Randomly select a fake transcript + const selectedTranscript = + fakeTranscripts[Math.floor(Math.random() * fakeTranscripts.length)]; + // Split the selected transcript into characters + const characters = Array.from(selectedTranscript); - let counter = 0; - let liveTranscriptCopy = ''; - let intervalId = setInterval(() => { - if (counter < characters.length) { - liveTranscriptCopy += characters[counter]; - setLiveTranscript(liveTranscriptCopy); - counter++; - } else { - clearInterval(intervalId); - } - }, 50); // delay of 100ms + let counter = 0; + let liveTranscriptCopy = ""; + let intervalId = setInterval(() => { + if (counter < characters.length) { + liveTranscriptCopy += characters[counter]; + setLiveTranscript(liveTranscriptCopy); + counter++; + } else { + clearInterval(intervalId); + } + }, 50); // delay of 100ms - // Cleanup function to clear the interval when the component unmounts - return () => clearInterval(intervalId); - }, []); + // Cleanup function to clear the interval when the component unmounts + return () => clearInterval(intervalId); + }, []); - const generateDecibelData = (x) => { - let data = []; - let random = Mulberry32(123456789 + x); - for (let i = 0; i < 50; i++) { - data.push(Math.floor(random() * 30) + 10); // generate random values between 10 and 40 - } - return data; - }; - const generateDecibelGraph = (decibelData) => { - return decibelData.map((decibel, i) => ( -
 
- )); - }; + const generateDecibelData = (x) => { + let data = []; + let random = Mulberry32(123456789 + x); + for (let i = 0; i < 50; i++) { + data.push(Math.floor(random() * 30) + 10); // generate random values between 10 and 40 + } + return data; + }; + const generateDecibelGraph = (decibelData) => { + return decibelData.map((decibel, i) => ( +
+   +
+ )); + }; - - // This is hardcoded data for proof of concept - const data = [ - { timestamp: '00:00', topic: 'Meeting Introduction', decibel: generateDecibelData(1), transcript: "This is the meeting introduction, we will be discussing several important topics today." }, - { timestamp: '00:48', topic: 'Discussing Quarterly Revenue', decibel: generateDecibelData(2), transcript: "We are discussing the quarterly revenue here, it appears our revenue has grown by 15% compared to the previous quarter." }, - { timestamp: '01:35', topic: 'Annual Sales Review', decibel: generateDecibelData(3), transcript: "Now we're reviewing the annual sales, there was a significant boost during the holiday season." }, - { timestamp: '02:20', topic: 'Operational Costs Analysis', decibel: generateDecibelData(4), transcript: "Moving on to the operational costs analysis, we have managed to reduce unnecessary expenses." }, - { timestamp: '03:10', topic: 'Employee Performance', decibel: generateDecibelData(5), transcript: "Let's talk about the employee performance, overall the team has done a great job." }, -/* { timestamp: '03:45', topic: 'New Marketing Strategies', decibel: generateDecibelData(6), transcript: "Our marketing team has proposed some new strategies that we'll discuss now." }, + // This is hardcoded data for proof of concept + const data = [ + { + timestamp: "00:00", + topic: "Meeting Introduction", + decibel: generateDecibelData(1), + transcript: + "This is the meeting introduction, we will be discussing several important topics today.", + }, + { + timestamp: "00:48", + topic: "Discussing Quarterly Revenue", + decibel: generateDecibelData(2), + transcript: + "We are discussing the quarterly revenue here, it appears our revenue has grown by 15% compared to the previous quarter.", + }, + { + timestamp: "01:35", + topic: "Annual Sales Review", + decibel: generateDecibelData(3), + transcript: + "Now we're reviewing the annual sales, there was a significant boost during the holiday season.", + }, + { + timestamp: "02:20", + topic: "Operational Costs Analysis", + decibel: generateDecibelData(4), + transcript: + "Moving on to the operational costs analysis, we have managed to reduce unnecessary expenses.", + }, + { + timestamp: "03:10", + topic: "Employee Performance", + decibel: generateDecibelData(5), + transcript: + "Let's talk about the employee performance, overall the team has done a great job.", + }, + /* { timestamp: '03:45', topic: 'New Marketing Strategies', decibel: generateDecibelData(6), transcript: "Our marketing team has proposed some new strategies that we'll discuss now." }, { timestamp: '04:30', topic: 'Customer Feedback', decibel: generateDecibelData(7), transcript: "Let's go through some customer feedback that we've received." }, { timestamp: '05:15', topic: 'Product Development', decibel: generateDecibelData(8), transcript: "Product development is going well and the new product line will be ready to launch next quarter." }, { timestamp: '06:00', topic: 'Discussing Future Projects', decibel: generateDecibelData(9), transcript: "Now we are talking about the future projects, we have some exciting projects lined up." }, { timestamp: '06:45', topic: 'Meeting Conclusion', decibel: generateDecibelData(10), transcript: "As we conclude the meeting, I want to thank everyone for their hard work and dedication." }, */ - ]; + ]; - return ( + return ( <> -
-
-

Reflector

-

Capture The Signal, Not The Noise

-
-
-
Timestamp
-
Topic
-
-
- {data.map((item, index) => ( -
-
setOpenIndex(openIndex === index ? null : index)}> -
{item.timestamp}
-
{item.topic} {'>'}
-
- {generateDecibelGraph(item.decibel)} -
-
- {openIndex === index && ( -
- {item.transcript} -
- )} -
- ))} -
-
-
Live
-
Transcript
-
- {generateDecibelGraph(generateDecibelData())} -
-
-
- {liveTranscript} -
-
- - - - +
+
+

Reflector

+

Capture The Signal, Not The Noise

+
+
Timestamp
+
Topic
+
+
+ {data.map((item, index) => ( +
+
setOpenIndex(openIndex === index ? null : index)} + > +
{item.timestamp}
+
+ {item.topic}{" "} + + {">"} + +
+
+ {generateDecibelGraph(item.decibel)} +
+
+ {openIndex === index && ( +
{item.transcript}
+ )} +
+ ))} +
+
+
Live
+
Transcript
+
+ {generateDecibelGraph(generateDecibelData())} +
+
+
{liveTranscript}
+
+ + + +
-); -}; + ); +} diff --git a/app/components/record.js b/app/components/record.js index f6af74ca..0654f4dd 100644 --- a/app/components/record.js +++ b/app/components/record.js @@ -1,46 +1,45 @@ export default function Record(props) { - let mediaRecorder = null; // mediaRecorder instance + let mediaRecorder = null; // mediaRecorder instance - const startRecording = () => { - navigator.mediaDevices.getUserMedia({ audio: true }) - .then(stream => { - mediaRecorder = new MediaRecorder(stream); - mediaRecorder.start(); - props.onRecord(true); - }); - }; + const startRecording = () => { + navigator.mediaDevices.getUserMedia({ audio: true }).then((stream) => { + mediaRecorder = new MediaRecorder(stream); + mediaRecorder.start(); + props.onRecord(true); + }); + }; - const stopRecording = () => { - if (mediaRecorder) { - mediaRecorder.stop(); - props.onRecord(false); - } - }; + const stopRecording = () => { + if (mediaRecorder) { + mediaRecorder.stop(); + props.onRecord(false); + } + }; - return ( -
-
-

Reflector

-

Capture The Signal, Not The Noise

-
+ return ( +
+
+

Reflector

+

Capture The Signal, Not The Noise

+
-
- {!props.isRecording ? ( - - ) : ( - - )} -
-
- ) +
+ {!props.isRecording ? ( + + ) : ( + + )} +
+
+ ); } diff --git a/app/components/webrtc.js b/app/components/webrtc.js index 26612904..9ca8b4f6 100644 --- a/app/components/webrtc.js +++ b/app/components/webrtc.js @@ -1,36 +1,36 @@ -import { useEffect, useState } from 'react'; -import Peer from 'simple-peer'; +import { useEffect, useState } from "react"; +import Peer from "simple-peer"; const useWebRTC = (stream) => { - const [data, setData] = useState(null); + const [data, setData] = useState(null); - useEffect(() => { - let peer = new Peer({ initiator: true, stream: stream }); + useEffect(() => { + let peer = new Peer({ initiator: true, stream: stream }); - peer.on('signal', data => { - // This is where you'd send the signal data to the server. - // The server would then send it back to other peers who would then - // use `peer.signal()` method to continue the connection negotiation. - console.log('signal', data); - }); + peer.on("signal", (data) => { + // This is where you'd send the signal data to the server. + // The server would then send it back to other peers who would then + // use `peer.signal()` method to continue the connection negotiation. + console.log("signal", data); + }); - peer.on('connect', () => { - console.log('WebRTC connected'); - }); + peer.on("connect", () => { + console.log("WebRTC connected"); + }); - peer.on('data', data => { - // Received data from the server. - const serverData = JSON.parse(data.toString()); - setData(serverData); - }); + peer.on("data", (data) => { + // Received data from the server. + const serverData = JSON.parse(data.toString()); + setData(serverData); + }); - // Clean up - return () => { - peer.destroy(); - } - }, [stream]); + // Clean up + return () => { + peer.destroy(); + }; + }, [stream]); - return data; + return data; }; export default useWebRTC; diff --git a/app/globals.css b/app/globals.css index 9e075856..168f6514 100644 --- a/app/globals.css +++ b/app/globals.css @@ -25,5 +25,5 @@ body { ) rgb(var(--background-start-rgb)); - font-family: 'Roboto', sans-serif; + font-family: "Roboto", sans-serif; } diff --git a/app/layout.js b/app/layout.js index 88b9c340..df1a0ac7 100644 --- a/app/layout.js +++ b/app/layout.js @@ -1,14 +1,14 @@ -import './globals.css' -import { Roboto } from 'next/font/google' +import "./globals.css"; +import { Roboto } from "next/font/google"; -import Head from 'next/head' +import Head from "next/head"; -const roboto = Roboto({ subsets: ['latin'], weight: '400' }) +const roboto = Roboto({ subsets: ["latin"], weight: "400" }); export const metadata = { - title: 'Reflector – Monadical', - description: 'Capture The Signal, Not The Noise', -} + title: "Reflector – Monadical", + description: "Capture The Signal, Not The Noise", +}; export default function RootLayout({ children }) { return ( @@ -18,5 +18,5 @@ export default function RootLayout({ children }) { {children} - ) + ); } diff --git a/app/page.js b/app/page.js index 0a26d0ce..ccc9c951 100644 --- a/app/page.js +++ b/app/page.js @@ -1,49 +1,55 @@ -"use client" -import React, { useState, useEffect } from 'react'; -import Record from './components/record.js'; -import { Dashboard } from './components/dashboard.js'; -import useWebRTC from './components/webrtc.js'; +"use client"; +import React, { useState, useEffect } from "react"; +import Record from "./components/record.js"; +import { Dashboard } from "./components/dashboard.js"; +import useWebRTC from "./components/webrtc.js"; const App = () => { const [isRecording, setIsRecording] = useState(false); const [splashScreen, setSplashScreen] = useState(true); - - - + const handleRecord = (recording) => { console.log("handleRecord", recording); setIsRecording(recording); setSplashScreen(false); - if (recording) - { - navigator.mediaDevices.getUserMedia({ audio: true }) + if (recording) { + navigator.mediaDevices + .getUserMedia({ audio: true }) .then(setStream) - .catch(err => console.error(err)); + .catch((err) => console.error(err)); } else if (!recording) { if (stream) { const tracks = stream.getTracks(); - tracks.forEach(track => track.stop()); + tracks.forEach((track) => track.stop()); setStream(null); } setIsRecording(false); } }; - + const [stream, setStream] = useState(null); const serverData = useWebRTC(stream); console.log(serverData); - return ( -
- {splashScreen && handleRecord(recording)} /> } - {!splashScreen && handleRecord(recording)} />} -
- ); + return ( +
+ {splashScreen && ( + handleRecord(recording)} + /> + )} + {!splashScreen && ( + handleRecord(recording)} + /> + )} +
+ ); +}; -} - - -export default App; \ No newline at end of file +export default App; diff --git a/app/utils.js b/app/utils.js index 2e7d8e16..37c4dee7 100644 --- a/app/utils.js +++ b/app/utils.js @@ -1,21 +1,19 @@ export function getRandomNumber(min, max) { - return Math.floor(Math.random() * (max - min + 1)) + min; + return Math.floor(Math.random() * (max - min + 1)) + min; } export function SeededRand(seed) { - seed ^= seed << 13 - seed ^= seed >> 17 - seed ^= seed << 5 - return seed / (2 ** 32) + seed ^= seed << 13; + seed ^= seed >> 17; + seed ^= seed << 5; + return seed / 2 ** 32; } - - export function Mulberry32(seed) { - return function () { - var t = seed += 0x6D2B79F5; - t = Math.imul(t ^ t >>> 15, t | 1); - t ^= t + Math.imul(t ^ t >>> 7, t | 61); - return ((t ^ t >>> 14) >>> 0) / 4294967296; - } + return function () { + var t = (seed += 0x6d2b79f5); + t = Math.imul(t ^ (t >>> 15), t | 1); + t ^= t + Math.imul(t ^ (t >>> 7), t | 61); + return ((t ^ (t >>> 14)) >>> 0) / 4294967296; + }; } diff --git a/next.config.js b/next.config.js index 767719fc..658404ac 100644 --- a/next.config.js +++ b/next.config.js @@ -1,4 +1,4 @@ /** @type {import('next').NextConfig} */ -const nextConfig = {} +const nextConfig = {}; -module.exports = nextConfig +module.exports = nextConfig; diff --git a/package.json b/package.json index aab669ed..228e4608 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,8 @@ "dev": "next dev", "build": "next build", "start": "next start", - "lint": "next lint" + "lint": "next lint", + "format": "prettier --write ." }, "dependencies": { "autoprefixer": "10.4.14", @@ -17,5 +18,12 @@ "simple-peer": "^9.11.1", "supports-color": "^9.4.0", "tailwindcss": "^3.3.2" + }, + "main": "index.js", + "repository": "https://github.com/Monadical-SAS/reflector-ui.git", + "author": "Koper ", + "license": "MIT", + "devDependencies": { + "prettier": "^3.0.0" } } diff --git a/postcss.config.js b/postcss.config.js index 33ad091d..12a703d9 100644 --- a/postcss.config.js +++ b/postcss.config.js @@ -3,4 +3,4 @@ module.exports = { tailwindcss: {}, autoprefixer: {}, }, -} +}; diff --git a/tailwind.config.js b/tailwind.config.js index 8c4d1b21..78ebc4e7 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -1,18 +1,18 @@ /** @type {import('tailwindcss').Config} */ module.exports = { content: [ - './pages/**/*.{js,ts,jsx,tsx,mdx}', - './components/**/*.{js,ts,jsx,tsx,mdx}', - './app/**/*.{js,ts,jsx,tsx,mdx}', + "./pages/**/*.{js,ts,jsx,tsx,mdx}", + "./components/**/*.{js,ts,jsx,tsx,mdx}", + "./app/**/*.{js,ts,jsx,tsx,mdx}", ], theme: { extend: { backgroundImage: { - 'gradient-radial': 'radial-gradient(var(--tw-gradient-stops))', - 'gradient-conic': - 'conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))', + "gradient-radial": "radial-gradient(var(--tw-gradient-stops))", + "gradient-conic": + "conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))", }, }, }, plugins: [], -} +}; diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 00000000..7b8ebf7a --- /dev/null +++ b/yarn.lock @@ -0,0 +1,893 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@alloc/quick-lru@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" + integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== + +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/sourcemap-codec@1.4.14": + version "1.4.14" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.9": + version "0.3.18" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" + integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@next/env@13.4.10": + version "13.4.10" + resolved "https://registry.yarnpkg.com/@next/env/-/env-13.4.10.tgz#8b17783d2c09be126bbde9ff1164566517131bff" + integrity sha512-3G1yD/XKTSLdihyDSa8JEsaWOELY+OWe08o0LUYzfuHp1zHDA8SObQlzKt+v+wrkkPcnPweoLH1ImZeUa0A1NQ== + +"@next/swc-darwin-arm64@13.4.10": + version "13.4.10" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.10.tgz#962ac55559970d1725163ff9d62d008bc1c33503" + integrity sha512-4bsdfKmmg7mgFGph0UorD1xWfZ5jZEw4kKRHYEeTK9bT1QnMbPVPlVXQRIiFPrhoDQnZUoa6duuPUJIEGLV1Jg== + +"@next/swc-darwin-x64@13.4.10": + version "13.4.10" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.10.tgz#90c01fdce5101953df0039eef48e4074055cc5aa" + integrity sha512-ngXhUBbcZIWZWqNbQSNxQrB9T1V+wgfCzAor2olYuo/YpaL6mUYNUEgeBMhr8qwV0ARSgKaOp35lRvB7EmCRBg== + +"@next/swc-linux-arm64-gnu@13.4.10": + version "13.4.10" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.10.tgz#8fc25052c345ffc8f6c51f61d1bb6c359b80ab2b" + integrity sha512-SjCZZCOmHD4uyM75MVArSAmF5Y+IJSGroPRj2v9/jnBT36SYFTORN8Ag/lhw81W9EeexKY/CUg2e9mdebZOwsg== + +"@next/swc-linux-arm64-musl@13.4.10": + version "13.4.10" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.10.tgz#25e6b0dbb87c89c44c3e3680227172862bc7072c" + integrity sha512-F+VlcWijX5qteoYIOxNiBbNE8ruaWuRlcYyIRK10CugqI/BIeCDzEDyrHIHY8AWwbkTwe6GRHabMdE688Rqq4Q== + +"@next/swc-linux-x64-gnu@13.4.10": + version "13.4.10" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.10.tgz#24fa8070ea0855c0aa020832ce7d1b84d3413fc1" + integrity sha512-WDv1YtAV07nhfy3i1visr5p/tjiH6CeXp4wX78lzP1jI07t4PnHHG1WEDFOduXh3WT4hG6yN82EQBQHDi7hBrQ== + +"@next/swc-linux-x64-musl@13.4.10": + version "13.4.10" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.10.tgz#ae55914d50589a4f8b91c8eeebdd713f0c1b1675" + integrity sha512-zFkzqc737xr6qoBgDa3AwC7jPQzGLjDlkNmt/ljvQJ/Veri5ECdHjZCUuiTUfVjshNIIpki6FuP0RaQYK9iCRg== + +"@next/swc-win32-arm64-msvc@13.4.10": + version "13.4.10" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.10.tgz#ab3098b2305f3c0e46dfb2e318a9988bff884047" + integrity sha512-IboRS8IWz5mWfnjAdCekkl8s0B7ijpWeDwK2O8CdgZkoCDY0ZQHBSGiJ2KViAG6+BJVfLvcP+a2fh6cdyBr9QQ== + +"@next/swc-win32-ia32-msvc@13.4.10": + version "13.4.10" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.10.tgz#a1c5980538641ca656012c00d05b08882cf0ec9f" + integrity sha512-bSA+4j8jY4EEiwD/M2bol4uVEu1lBlgsGdvM+mmBm/BbqofNBfaZ2qwSbwE2OwbAmzNdVJRFRXQZ0dkjopTRaQ== + +"@next/swc-win32-x64-msvc@13.4.10": + version "13.4.10" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.10.tgz#44dd9eea943ed14a1012edd5011b8e905f5e6fc4" + integrity sha512-g2+tU63yTWmcVQKDGY0MV1PjjqgZtwM4rB1oVVi/v0brdZAcrcTV+04agKzWtvWroyFz6IqtT0MoZJA7PNyLVw== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@swc/helpers@0.5.1": + version "0.5.1" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.1.tgz#e9031491aa3f26bfcc974a67f48bd456c8a5357a" + integrity sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg== + dependencies: + tslib "^2.4.0" + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +arg@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== + +autoprefixer@10.4.14: + version "10.4.14" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.14.tgz#e28d49902f8e759dd25b153264e862df2705f79d" + integrity sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ== + dependencies: + browserslist "^4.21.5" + caniuse-lite "^1.0.30001464" + fraction.js "^4.2.0" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.21.5: + version "4.21.9" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.9.tgz#e11bdd3c313d7e2a9e87e8b4b0c7872b13897635" + integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== + dependencies: + caniuse-lite "^1.0.30001503" + electron-to-chromium "^1.4.431" + node-releases "^2.0.12" + update-browserslist-db "^1.0.11" + +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +busboy@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== + dependencies: + streamsearch "^1.1.0" + +camelcase-css@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + +caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001464, caniuse-lite@^1.0.30001503: + version "1.0.30001516" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001516.tgz#621b1be7d85a8843ee7d210fd9d87b52e3daab3a" + integrity sha512-Wmec9pCBY8CWbmI4HsjBeQLqDTqV91nFVR83DnZpYyRnPI1wePDsTg0bGLPC5VU/3OIZV1fmxEea1b+tFKe86g== + +chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + 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" + optionalDependencies: + fsevents "~2.3.2" + +client-only@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" + integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== + +commander@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +debug@^4.3.2: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +didyoumean@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== + +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + +electron-to-chromium@^1.4.431: + version "1.4.463" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.463.tgz#8eb04355f24fef5c8097661d14e143f6d8554055" + integrity sha512-fT3hvdUWLjDbaTGzyOjng/CQhQJSQP8ThO3XZAoaxHvHo2kUXiRQVMj9M235l8uDFiNPsPa6KHT1p3RaR6ugRw== + +err-code@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-3.0.1.tgz#a444c7b992705f2b120ee320b09972eef331c920" + integrity sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA== + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +fast-glob@^3.2.12: + version "3.3.0" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.0.tgz#7c40cb491e1e2ed5664749e87bfb516dbe8727c0" + integrity sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA== + 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" + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +fraction.js@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" + integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@~2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +get-browser-rtc@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/get-browser-rtc/-/get-browser-rtc-1.1.0.tgz#d1494e299b00f33fc8e9d6d3343ba4ba99711a2c" + integrity sha512-MghbMJ61EJrRsDe7w1Bvqt3ZsBuqhce5nrn/XAwgwOXhcsz53/ltdxOse1h/8eKXj5slzxdsz56g5rzOFSGwfQ== + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +glob@7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +graceful-fs@^4.1.2: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-core-module@^2.11.0: + version "2.12.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" + integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== + dependencies: + has "^1.0.3" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +jiti@^1.18.2: + version "1.19.1" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.19.1.tgz#fa99e4b76a23053e0e7cde098efe1704a14c16f1" + integrity sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg== + +"js-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +lilconfig@^2.0.5, lilconfig@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +loose-envify@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4, micromatch@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +minimatch@^3.0.4: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +nanoid@^3.3.4, nanoid@^3.3.6: + version "3.3.6" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" + integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== + +next@^13.4.9: + version "13.4.10" + resolved "https://registry.yarnpkg.com/next/-/next-13.4.10.tgz#a5b50696759c61663d5a1dd726995fa0576a382e" + integrity sha512-4ep6aKxVTQ7rkUW2fBLhpBr/5oceCuf4KmlUpvG/aXuDTIf9mexNSpabUD6RWPspu6wiJJvozZREhXhueYO36A== + dependencies: + "@next/env" "13.4.10" + "@swc/helpers" "0.5.1" + busboy "1.6.0" + caniuse-lite "^1.0.30001406" + postcss "8.4.14" + styled-jsx "5.1.1" + watchpack "2.4.0" + zod "3.21.4" + optionalDependencies: + "@next/swc-darwin-arm64" "13.4.10" + "@next/swc-darwin-x64" "13.4.10" + "@next/swc-linux-arm64-gnu" "13.4.10" + "@next/swc-linux-arm64-musl" "13.4.10" + "@next/swc-linux-x64-gnu" "13.4.10" + "@next/swc-linux-x64-musl" "13.4.10" + "@next/swc-win32-arm64-msvc" "13.4.10" + "@next/swc-win32-ia32-msvc" "13.4.10" + "@next/swc-win32-x64-msvc" "13.4.10" + +node-releases@^2.0.12: + version "2.0.13" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" + integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + +object-assign@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-hash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +pirates@^4.0.1: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + +postcss-import@^15.1.0: + version "15.1.0" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" + integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-js@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" + integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== + dependencies: + camelcase-css "^2.0.1" + +postcss-load-config@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.1.tgz#152383f481c2758274404e4962743191d73875bd" + integrity sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA== + dependencies: + lilconfig "^2.0.5" + yaml "^2.1.1" + +postcss-nested@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.1.tgz#f83dc9846ca16d2f4fa864f16e9d9f7d0961662c" + integrity sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== + dependencies: + postcss-selector-parser "^6.0.11" + +postcss-selector-parser@^6.0.11: + version "6.0.13" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b" + integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@8.4.14: + version "8.4.14" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf" + integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig== + dependencies: + nanoid "^3.3.4" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +postcss@8.4.25: + version "8.4.25" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.25.tgz#4a133f5e379eda7f61e906c3b1aaa9b81292726f" + integrity sha512-7taJ/8t2av0Z+sQEvNzCkpDynl0tX3uJMCODi6nT3PfASC7dYCWV9aQ+uiCf+KBD4SEFcu+GvJdGdwzQ6OSjCw== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +postcss@^8.4.23: + version "8.4.26" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.26.tgz#1bc62ab19f8e1e5463d98cf74af39702a00a9e94" + integrity sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +prettier@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.0.0.tgz#e7b19f691245a21d618c68bc54dc06122f6105ae" + integrity sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g== + +queue-microtask@^1.2.2, queue-microtask@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +react-dom@^18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" + integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.0" + +react@^18.2.0: + version "18.2.0" + resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + dependencies: + loose-envify "^1.1.0" + +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== + dependencies: + pify "^2.3.0" + +readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +resolve@^1.1.7, resolve@^1.22.2: + version "1.22.2" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" + integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== + dependencies: + is-core-module "^2.11.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-buffer@^5.1.0, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== + dependencies: + loose-envify "^1.1.0" + +simple-peer@^9.11.1: + version "9.11.1" + resolved "https://registry.yarnpkg.com/simple-peer/-/simple-peer-9.11.1.tgz#9814d5723f821b778b7fb011bdefcbd1e788e6cc" + integrity sha512-D1SaWpOW8afq1CZGWB8xTfrT3FekjQmPValrqncJMX7QFl8YwhrPTZvMCANLtgBwwdS+7zURyqxDDEmY558tTw== + dependencies: + buffer "^6.0.3" + debug "^4.3.2" + err-code "^3.0.1" + get-browser-rtc "^1.1.0" + queue-microtask "^1.2.3" + randombytes "^2.1.0" + readable-stream "^3.6.0" + +source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +streamsearch@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +styled-jsx@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.1.tgz#839a1c3aaacc4e735fed0781b8619ea5d0009d1f" + integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw== + dependencies: + client-only "0.0.1" + +sucrase@^3.32.0: + version "3.33.0" + resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.33.0.tgz#092c8d2f99a191f2cd9f1fdd52113772f4241f6e" + integrity sha512-ARGC7vbufOHfpvyGcZZXFaXCMZ9A4fffOGC5ucOW7+WHDGlAe8LJdf3Jts1sWhDeiI1RSWrKy5Hodl+JWGdW2A== + dependencies: + "@jridgewell/gen-mapping" "^0.3.2" + commander "^4.0.0" + glob "7.1.6" + lines-and-columns "^1.1.6" + mz "^2.7.0" + pirates "^4.0.1" + ts-interface-checker "^0.1.9" + +supports-color@^9.4.0: + version "9.4.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-9.4.0.tgz#17bfcf686288f531db3dea3215510621ccb55954" + integrity sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw== + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +tailwindcss@^3.3.2: + version "3.3.3" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.3.3.tgz#90da807393a2859189e48e9e7000e6880a736daf" + integrity sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w== + 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.2.12" + glob-parent "^6.0.2" + is-glob "^4.0.3" + jiti "^1.18.2" + 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" + +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +ts-interface-checker@^0.1.9: + version "0.1.13" + resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" + integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== + +tslib@^2.4.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.0.tgz#b295854684dbda164e181d259a22cd779dcd7bc3" + integrity sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA== + +update-browserslist-db@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" + integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +util-deprecate@^1.0.1, util-deprecate@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +watchpack@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +yaml@^2.1.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.1.tgz#02fe0975d23cd441242aa7204e09fc28ac2ac33b" + integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ== + +zod@3.21.4: + version "3.21.4" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.21.4.tgz#10882231d992519f0a10b5dd58a38c9dabbb64db" + integrity sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw== From e8aa72b0e43e5f3a5deb3519a683d783ee66bf12 Mon Sep 17 00:00:00 2001 From: Andreas Bonini <78463782+AndreasBonini@users.noreply.github.com> Date: Tue, 18 Jul 2023 16:26:05 +0700 Subject: [PATCH 08/41] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 58b561c4..7b495dcd 100644 --- a/README.md +++ b/README.md @@ -70,4 +70,4 @@ This data is then returned from the `useWebRTC` hook and can be used in your com ## Contribution Guidelines -All new contributions should be made in a separate branch. Before any code is merged into `master`, it requires a code review by Andreas. +All new contributions should be made in a separate branch. Before any code is merged into `master`, it requires a code review. From 6c8caaab093d6f7cf7687a9e13d8bf96d7660050 Mon Sep 17 00:00:00 2001 From: Koper Date: Tue, 18 Jul 2023 17:38:35 +0700 Subject: [PATCH 09/41] Styled buttons --- app/components/dashboard.js | 9 ++- app/components/record.js | 10 +-- app/page.js | 1 + public/button.css | 123 ++++++++++++++++++++++++++++++++++++ 4 files changed, 132 insertions(+), 11 deletions(-) create mode 100644 public/button.css diff --git a/app/components/dashboard.js b/app/components/dashboard.js index ed92fb9a..952c7f47 100644 --- a/app/components/dashboard.js +++ b/app/components/dashboard.js @@ -153,13 +153,16 @@ export function Dashboard(props) { + +
+ Reflector © 2023 Monadical +
); diff --git a/app/components/record.js b/app/components/record.js index 0654f4dd..03c9c4aa 100644 --- a/app/components/record.js +++ b/app/components/record.js @@ -25,17 +25,11 @@ export default function Record(props) {
{!props.isRecording ? ( - ) : ( - )} diff --git a/app/page.js b/app/page.js index ccc9c951..563a9942 100644 --- a/app/page.js +++ b/app/page.js @@ -3,6 +3,7 @@ import React, { useState, useEffect } from "react"; import Record from "./components/record.js"; import { Dashboard } from "./components/dashboard.js"; import useWebRTC from "./components/webrtc.js"; +import "../public/button.css"; const App = () => { const [isRecording, setIsRecording] = useState(false); diff --git a/public/button.css b/public/button.css new file mode 100644 index 00000000..7ce20d89 --- /dev/null +++ b/public/button.css @@ -0,0 +1,123 @@ +/* Define basic button styles */ +input[type="button"], +button { + /* Reset default button styles */ + border: none; + background-color: transparent; + font-family: inherit; + padding: 0; + cursor: pointer; + /* Visual */ + background-color: #3e68ff; + color: #fff; + border-radius: 8px; + box-shadow: 0 3px 5px rgba(0, 0, 0, 0.18); + /* Size */ + padding: 0.25em 0.75em; + min-width: 10ch; + min-height: 44px; + /* Text */ + text-align: center; + line-height: 1.1; + /* Display */ + display: inline-flex; + align-items: center; + justify-content: center; + align-self: start; + /* Optional - see "Gotchas" */ + /* Animation */ + transition: 220ms all ease-in-out; + display: block; +} + +/* Button modifiers */ +input[type="button"].small, +button.small { + font-size: 1.15rem; +} + +input[type="button"].block, +button.block { + width: 100%; +} + +/* Disabled styles */ +input[type="button"][disabled], +button[disabled] { + border-color: #ccc; + background-color: #eee; + cursor: not-allowed; +} + +input[type="button"][disabled]:hover, +button[disabled]:hover { + background: #b8b8b8 !important; + cursor: not-allowed !important; +} + +/* Custom button properties */ +input[type="button"], +button { + width: 243px; + border: solid 1px #dadada; +} + +/* Red button states */ +input[type="button"][data-color="red"], +button[data-color="red"], +input[type="button"][data-color="red"]:hover, +button[data-color="red"]:hover, +input[type="button"][data-color="red"]:active, +button[data-color="red"]:active { + background-color: #cc3347; +} + +/* Green button states */ +input[type="button"][data-color="green"], +button[data-color="green"], +input[type="button"][data-color="green"]:hover, +button[data-color="green"]:hover, +input[type="button"][data-color="green"]:active, +button[data-color="green"]:active { + background-color: #33cc47; +} + +/* Blue button states */ +input[type="button"][data-color="blue"], +button[data-color="blue"], +input[type="button"][data-color="blue"]:hover, +button[data-color="blue"]:hover, +input[type="button"][data-color="blue"]:active, +button[data-color="blue"]:active { + background-color: #3347cc; +} + +/* Orange button states */ +input[type="button"][data-color="orange"], +button[data-color="orange"], +input[type="button"][data-color="orange"]:hover, +button[data-color="orange"]:hover, +input[type="button"][data-color="orange"]:active, +button[data-color="orange"]:active { + background-color: #ff7f00; +} + +/* Purple button states */ +input[type="button"][data-color="purple"], +button[data-color="purple"], +input[type="button"][data-color="purple"]:hover, +button[data-color="purple"]:hover, +input[type="button"][data-color="purple"]:active, +button[data-color="purple"]:active { + background-color: #800080; +} + +/* Yellow button states */ +input[type="button"][data-color="yellow"], +button[data-color="yellow"], +input[type="button"][data-color="yellow"]:hover, +button[data-color="yellow"]:hover, +input[type="button"][data-color="yellow"]:active, +button[data-color="yellow"]:active { + background-color: #ffff00; +} From a4e5ea2842ac6c9692941dacee0f8894ac9c31b4 Mon Sep 17 00:00:00 2001 From: "Juan Diego Caballero (JDC)" Date: Tue, 18 Jul 2023 17:15:25 -0500 Subject: [PATCH 10/41] Initial --- app/components/webrtc.js | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/app/components/webrtc.js b/app/components/webrtc.js index 9ca8b4f6..33860938 100644 --- a/app/components/webrtc.js +++ b/app/components/webrtc.js @@ -1,6 +1,8 @@ import { useEffect, useState } from "react"; import Peer from "simple-peer"; +const WebRTC_SERVER_URL = "http://127.0.0.1:1250/offer" + const useWebRTC = (stream) => { const [data, setData] = useState(null); @@ -11,7 +13,24 @@ const useWebRTC = (stream) => { // This is where you'd send the signal data to the server. // The server would then send it back to other peers who would then // use `peer.signal()` method to continue the connection negotiation. - console.log("signal", data); + if ('sdp' in data) { + fetch(WebRTC_SERVER_URL, { + body: JSON.stringify({ + sdp: data.sdp, + type: data.type, + }), + headers: { + 'Content-Type': 'application/json' + }, + method: 'POST' + }).then(function (response) { + return response.json(); + }).then(function (answer) { + return peer.signal(answer); + }).catch(function (e) { + alert(e); + }); + } }); peer.on("connect", () => { @@ -20,7 +39,8 @@ const useWebRTC = (stream) => { peer.on("data", (data) => { // Received data from the server. - const serverData = JSON.parse(data.toString()); + console.log(data.toString()) + const serverData = JSON.parse(data.toString().replace(/"/ig,'"')); setData(serverData); }); From 68899bd9bf397eccdf22dcfa1085c6fe7cb6b74d Mon Sep 17 00:00:00 2001 From: Jose B Date: Tue, 18 Jul 2023 17:36:30 -0500 Subject: [PATCH 11/41] re-arrange code --- app/components/audioVisualizer.js | 5 +---- app/components/dashboard.js | 27 ++++----------------------- app/components/record.js | 23 ++++++++++------------- app/page.js | 24 ++++++++++++++++-------- 4 files changed, 31 insertions(+), 48 deletions(-) diff --git a/app/components/audioVisualizer.js b/app/components/audioVisualizer.js index 12954d63..fedaa5da 100644 --- a/app/components/audioVisualizer.js +++ b/app/components/audioVisualizer.js @@ -56,10 +56,7 @@ function AudioVisualizer(props) { }, []); return ( - <> -

Is recording: {props.isRecording ? "true" : "false"}

- - + ); } diff --git a/app/components/dashboard.js b/app/components/dashboard.js index 952c7f47..d8dd0aa3 100644 --- a/app/components/dashboard.js +++ b/app/components/dashboard.js @@ -1,13 +1,10 @@ import { Mulberry32 } from "../utils.js"; import React, { useState, useEffect } from "react"; -import AudioVisualizer from "./audioVisualizer.js"; export function Dashboard(props) { const [openIndex, setOpenIndex] = useState(null); const [liveTranscript, setLiveTranscript] = useState(""); - const [fakeTranscriptIndex, setFakeTranscriptIndex] = useState(0); - const fakeTranscripts = [ "This is the first transcript. We are discussing the current situation of our company. We are currently leading the market with a significant margin, and our future outlook is also very promising...", "Here is the second transcript. We are now moving to our next topic, which is the progress in our ongoing projects. Most of them are on schedule and the quality of work is up to our standard...", @@ -104,11 +101,7 @@ export function Dashboard(props) { return ( <> -
-
-

Reflector

-

Capture The Signal, Not The Noise

-
+
Timestamp
Topic
@@ -136,11 +129,11 @@ export function Dashboard(props) {
{openIndex === index && ( -
{item.transcript}
+
{item.transcript}
)}
))} -
+
Live
Transcript
@@ -148,21 +141,9 @@ export function Dashboard(props) { {generateDecibelGraph(generateDecibelData())}
-
{liveTranscript}
+
{liveTranscript}
- - - -
- Reflector © 2023 Monadical -
); diff --git a/app/components/record.js b/app/components/record.js index 03c9c4aa..26bcc984 100644 --- a/app/components/record.js +++ b/app/components/record.js @@ -1,4 +1,6 @@ -export default function Record(props) { +import AudioVisualizer from "./audioVisualizer.js"; + +export default function Recorder(props) { let mediaRecorder = null; // mediaRecorder instance const startRecording = () => { @@ -17,23 +19,18 @@ export default function Record(props) { }; return ( -
-
-

Reflector

-

Capture The Signal, Not The Noise

-
+
+ {props.isRecording && } -
- {!props.isRecording ? ( - - ) : ( + {props.isRecording ? ( + ) : ( + )}
-
); } diff --git a/app/page.js b/app/page.js index 563a9942..5130b47a 100644 --- a/app/page.js +++ b/app/page.js @@ -1,6 +1,6 @@ "use client"; import React, { useState, useEffect } from "react"; -import Record from "./components/record.js"; +import Recorder from "./components/record.js"; import { Dashboard } from "./components/dashboard.js"; import useWebRTC from "./components/webrtc.js"; import "../public/button.css"; @@ -36,19 +36,27 @@ const App = () => { console.log(serverData); return ( -
- {splashScreen && ( - handleRecord(recording)} - /> - )} +
+
+

Reflector

+

Capture The Signal, Not The Noise

+
+ + handleRecord(recording)} + /> + {!splashScreen && ( handleRecord(recording)} /> )} + +
+ Reflector © 2023 Monadical +
); }; From 89978901335c86ea6f203d587fac1a3ae58c48c7 Mon Sep 17 00:00:00 2001 From: "Juan Diego Caballero (JDC)" Date: Tue, 18 Jul 2023 18:52:48 -0500 Subject: [PATCH 12/41] Revert --- app/components/webrtc.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/webrtc.js b/app/components/webrtc.js index 33860938..d1222b97 100644 --- a/app/components/webrtc.js +++ b/app/components/webrtc.js @@ -40,7 +40,7 @@ const useWebRTC = (stream) => { peer.on("data", (data) => { // Received data from the server. console.log(data.toString()) - const serverData = JSON.parse(data.toString().replace(/"/ig,'"')); + const serverData = JSON.parse(data.toString()); setData(serverData); }); From 55e425f2b161fea1da23dd3c8da91cf9c07a6ff0 Mon Sep 17 00:00:00 2001 From: Koper Date: Wed, 19 Jul 2023 13:17:09 +0700 Subject: [PATCH 13/41] yarn format + project architecture image in readme --- README.md | 5 + app/components/webrtc.js | 27 +-- package-lock.json | 19 ++ yarn.lock | 387 +++++++++++++++++---------------------- 4 files changed, 212 insertions(+), 226 deletions(-) diff --git a/README.md b/README.md index 7b495dcd..cd2cf49b 100644 --- a/README.md +++ b/README.md @@ -6,11 +6,16 @@ Reflector is a React application that uses WebRTC to stream audio from the brows - [Reflector React App](#reflector-react-app) - [Table of Contents](#table-of-contents) + - [Project Architecture](#project-architecture) - [Installation](#installation) - [Run the Application](#run-the-application) - [WebRTC Integration](#webrtc-integration) - [Contribution Guidelines](#contribution-guidelines) +## Project Architecture + +![Project Architecture](ProjectArchitecture.jpg) + ## Installation To install the application, run: diff --git a/app/components/webrtc.js b/app/components/webrtc.js index d1222b97..f13e8356 100644 --- a/app/components/webrtc.js +++ b/app/components/webrtc.js @@ -1,7 +1,7 @@ import { useEffect, useState } from "react"; import Peer from "simple-peer"; -const WebRTC_SERVER_URL = "http://127.0.0.1:1250/offer" +const WebRTC_SERVER_URL = "http://127.0.0.1:1250/offer"; const useWebRTC = (stream) => { const [data, setData] = useState(null); @@ -13,23 +13,26 @@ const useWebRTC = (stream) => { // This is where you'd send the signal data to the server. // The server would then send it back to other peers who would then // use `peer.signal()` method to continue the connection negotiation. - if ('sdp' in data) { + if ("sdp" in data) { fetch(WebRTC_SERVER_URL, { body: JSON.stringify({ sdp: data.sdp, type: data.type, }), headers: { - 'Content-Type': 'application/json' + "Content-Type": "application/json", }, - method: 'POST' - }).then(function (response) { - return response.json(); - }).then(function (answer) { - return peer.signal(answer); - }).catch(function (e) { - alert(e); - }); + method: "POST", + }) + .then(function (response) { + return response.json(); + }) + .then(function (answer) { + return peer.signal(answer); + }) + .catch(function (e) { + alert(e); + }); } }); @@ -39,7 +42,7 @@ const useWebRTC = (stream) => { peer.on("data", (data) => { // Received data from the server. - console.log(data.toString()) + console.log(data.toString()); const serverData = JSON.parse(data.toString()); setData(serverData); }); diff --git a/package-lock.json b/package-lock.json index 8826fd2f..cb583783 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,6 +7,7 @@ "": { "name": "reflector-ui", "version": "0.1.0", + "license": "MIT", "dependencies": { "autoprefixer": "10.4.14", "next": "^13.4.9", @@ -16,6 +17,9 @@ "simple-peer": "^9.11.1", "supports-color": "^9.4.0", "tailwindcss": "^3.3.2" + }, + "devDependencies": { + "prettier": "^3.0.0" } }, "node_modules/@alloc/quick-lru": { @@ -1170,6 +1174,21 @@ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, + "node_modules/prettier": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz", + "integrity": "sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==", + "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", diff --git a/yarn.lock b/yarn.lock index 7b8ebf7a..3ac29930 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4,12 +4,12 @@ "@alloc/quick-lru@^5.2.0": version "5.2.0" - resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" + resolved "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz" integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== "@jridgewell/gen-mapping@^0.3.2": version "0.3.3" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz" integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== dependencies: "@jridgewell/set-array" "^1.0.1" @@ -18,98 +18,58 @@ "@jridgewell/resolve-uri@3.1.0": version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== "@jridgewell/set-array@^1.0.1": version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== -"@jridgewell/sourcemap-codec@1.4.14": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.15" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== +"@jridgewell/sourcemap-codec@1.4.14": + version "1.4.14" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + "@jridgewell/trace-mapping@^0.3.9": version "0.3.18" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz" integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== dependencies: "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" -"@next/env@13.4.10": - version "13.4.10" - resolved "https://registry.yarnpkg.com/@next/env/-/env-13.4.10.tgz#8b17783d2c09be126bbde9ff1164566517131bff" - integrity sha512-3G1yD/XKTSLdihyDSa8JEsaWOELY+OWe08o0LUYzfuHp1zHDA8SObQlzKt+v+wrkkPcnPweoLH1ImZeUa0A1NQ== +"@next/env@13.4.9": + version "13.4.9" + resolved "https://registry.npmjs.org/@next/env/-/env-13.4.9.tgz" + integrity sha512-vuDRK05BOKfmoBYLNi2cujG2jrYbEod/ubSSyqgmEx9n/W3eZaJQdRNhTfumO+qmq/QTzLurW487n/PM/fHOkw== -"@next/swc-darwin-arm64@13.4.10": - version "13.4.10" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.10.tgz#962ac55559970d1725163ff9d62d008bc1c33503" - integrity sha512-4bsdfKmmg7mgFGph0UorD1xWfZ5jZEw4kKRHYEeTK9bT1QnMbPVPlVXQRIiFPrhoDQnZUoa6duuPUJIEGLV1Jg== - -"@next/swc-darwin-x64@13.4.10": - version "13.4.10" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.10.tgz#90c01fdce5101953df0039eef48e4074055cc5aa" - integrity sha512-ngXhUBbcZIWZWqNbQSNxQrB9T1V+wgfCzAor2olYuo/YpaL6mUYNUEgeBMhr8qwV0ARSgKaOp35lRvB7EmCRBg== - -"@next/swc-linux-arm64-gnu@13.4.10": - version "13.4.10" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.10.tgz#8fc25052c345ffc8f6c51f61d1bb6c359b80ab2b" - integrity sha512-SjCZZCOmHD4uyM75MVArSAmF5Y+IJSGroPRj2v9/jnBT36SYFTORN8Ag/lhw81W9EeexKY/CUg2e9mdebZOwsg== - -"@next/swc-linux-arm64-musl@13.4.10": - version "13.4.10" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.10.tgz#25e6b0dbb87c89c44c3e3680227172862bc7072c" - integrity sha512-F+VlcWijX5qteoYIOxNiBbNE8ruaWuRlcYyIRK10CugqI/BIeCDzEDyrHIHY8AWwbkTwe6GRHabMdE688Rqq4Q== - -"@next/swc-linux-x64-gnu@13.4.10": - version "13.4.10" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.10.tgz#24fa8070ea0855c0aa020832ce7d1b84d3413fc1" - integrity sha512-WDv1YtAV07nhfy3i1visr5p/tjiH6CeXp4wX78lzP1jI07t4PnHHG1WEDFOduXh3WT4hG6yN82EQBQHDi7hBrQ== - -"@next/swc-linux-x64-musl@13.4.10": - version "13.4.10" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.10.tgz#ae55914d50589a4f8b91c8eeebdd713f0c1b1675" - integrity sha512-zFkzqc737xr6qoBgDa3AwC7jPQzGLjDlkNmt/ljvQJ/Veri5ECdHjZCUuiTUfVjshNIIpki6FuP0RaQYK9iCRg== - -"@next/swc-win32-arm64-msvc@13.4.10": - version "13.4.10" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.10.tgz#ab3098b2305f3c0e46dfb2e318a9988bff884047" - integrity sha512-IboRS8IWz5mWfnjAdCekkl8s0B7ijpWeDwK2O8CdgZkoCDY0ZQHBSGiJ2KViAG6+BJVfLvcP+a2fh6cdyBr9QQ== - -"@next/swc-win32-ia32-msvc@13.4.10": - version "13.4.10" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.10.tgz#a1c5980538641ca656012c00d05b08882cf0ec9f" - integrity sha512-bSA+4j8jY4EEiwD/M2bol4uVEu1lBlgsGdvM+mmBm/BbqofNBfaZ2qwSbwE2OwbAmzNdVJRFRXQZ0dkjopTRaQ== - -"@next/swc-win32-x64-msvc@13.4.10": - version "13.4.10" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.10.tgz#44dd9eea943ed14a1012edd5011b8e905f5e6fc4" - integrity sha512-g2+tU63yTWmcVQKDGY0MV1PjjqgZtwM4rB1oVVi/v0brdZAcrcTV+04agKzWtvWroyFz6IqtT0MoZJA7PNyLVw== +"@next/swc-darwin-arm64@13.4.9": + version "13.4.9" + resolved "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.9.tgz" + integrity sha512-TVzGHpZoVBk3iDsTOQA/R6MGmFp0+17SWXMEWd6zG30AfuELmSSMe2SdPqxwXU0gbpWkJL1KgfLzy5ReN0crqQ== "@nodelib/fs.scandir@2.1.5": version "2.1.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": version "2.0.5" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== "@nodelib/fs.walk@^1.2.3": version "1.2.8" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: "@nodelib/fs.scandir" "2.1.5" @@ -117,19 +77,19 @@ "@swc/helpers@0.5.1": version "0.5.1" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.1.tgz#e9031491aa3f26bfcc974a67f48bd456c8a5357a" + resolved "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.1.tgz" integrity sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg== dependencies: tslib "^2.4.0" any-promise@^1.0.0: version "1.3.0" - resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz" integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== anymatch@~3.1.2: version "3.1.3" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: normalize-path "^3.0.0" @@ -137,12 +97,12 @@ anymatch@~3.1.2: arg@^5.0.2: version "5.0.2" - resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== autoprefixer@10.4.14: version "10.4.14" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.14.tgz#e28d49902f8e759dd25b153264e862df2705f79d" + resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz" integrity sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ== dependencies: browserslist "^4.21.5" @@ -154,22 +114,22 @@ autoprefixer@10.4.14: balanced-match@^1.0.0: version "1.0.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base64-js@^1.3.1: version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== binary-extensions@^2.0.0: version "2.2.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== brace-expansion@^1.1.7: version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" @@ -177,14 +137,14 @@ brace-expansion@^1.1.7: braces@^3.0.2, braces@~3.0.2: version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== dependencies: fill-range "^7.0.1" -browserslist@^4.21.5: +browserslist@^4.21.5, "browserslist@>= 4.21.0": version "4.21.9" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.9.tgz#e11bdd3c313d7e2a9e87e8b4b0c7872b13897635" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz" integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== dependencies: caniuse-lite "^1.0.30001503" @@ -194,7 +154,7 @@ browserslist@^4.21.5: buffer@^6.0.3: version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== dependencies: base64-js "^1.3.1" @@ -202,24 +162,24 @@ buffer@^6.0.3: busboy@1.6.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + resolved "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz" integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== dependencies: streamsearch "^1.1.0" camelcase-css@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001464, caniuse-lite@^1.0.30001503: - version "1.0.30001516" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001516.tgz#621b1be7d85a8843ee7d210fd9d87b52e3daab3a" - integrity sha512-Wmec9pCBY8CWbmI4HsjBeQLqDTqV91nFVR83DnZpYyRnPI1wePDsTg0bGLPC5VU/3OIZV1fmxEea1b+tFKe86g== + version "1.0.30001515" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001515.tgz" + integrity sha512-eEFDwUOZbE24sb+Ecsx3+OvNETqjWIdabMy52oOkIgcUtAsQifjUG9q4U9dgTHJM2mfk4uEPxc0+xuFdJ629QA== chokidar@^3.5.3: version "3.5.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== dependencies: anymatch "~3.1.2" @@ -234,59 +194,59 @@ chokidar@^3.5.3: client-only@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" + resolved "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz" integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== commander@^4.0.0: version "4.1.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== concat-map@0.0.1: version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== cssesc@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== debug@^4.3.2: version "4.3.4" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" didyoumean@^1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" + resolved "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz" integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== dlv@^1.1.3: version "1.1.3" - resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + resolved "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz" integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== electron-to-chromium@^1.4.431: - version "1.4.463" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.463.tgz#8eb04355f24fef5c8097661d14e143f6d8554055" - integrity sha512-fT3hvdUWLjDbaTGzyOjng/CQhQJSQP8ThO3XZAoaxHvHo2kUXiRQVMj9M235l8uDFiNPsPa6KHT1p3RaR6ugRw== + version "1.4.455" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.455.tgz" + integrity sha512-8tgdX0Odl24LtmLwxotpJCVjIndN559AvaOtd67u+2mo+IDsgsTF580NB+uuDCqsHw8yFg53l5+imFV9Fw3cbA== err-code@^3.0.1: version "3.0.1" - resolved "https://registry.yarnpkg.com/err-code/-/err-code-3.0.1.tgz#a444c7b992705f2b120ee320b09972eef331c920" + resolved "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz" integrity sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA== escalade@^3.1.1: version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== fast-glob@^3.2.12: version "3.3.0" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.0.tgz#7c40cb491e1e2ed5664749e87bfb516dbe8727c0" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz" integrity sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA== dependencies: "@nodelib/fs.stat" "^2.0.2" @@ -297,65 +257,72 @@ fast-glob@^3.2.12: fastq@^1.6.0: version "1.15.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz" integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== dependencies: reusify "^1.0.4" fill-range@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== dependencies: to-regex-range "^5.0.1" fraction.js@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" + resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz" integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== fs.realpath@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@~2.3.2: version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== function-bind@^1.1.1: version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== get-browser-rtc@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/get-browser-rtc/-/get-browser-rtc-1.1.0.tgz#d1494e299b00f33fc8e9d6d3343ba4ba99711a2c" + resolved "https://registry.npmjs.org/get-browser-rtc/-/get-browser-rtc-1.1.0.tgz" integrity sha512-MghbMJ61EJrRsDe7w1Bvqt3ZsBuqhce5nrn/XAwgwOXhcsz53/ltdxOse1h/8eKXj5slzxdsz56g5rzOFSGwfQ== -glob-parent@^5.1.2, glob-parent@~5.1.2: +glob-parent@^5.1.2: version "5.1.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" glob-parent@^6.0.2: version "6.0.2" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== dependencies: is-glob "^4.0.3" +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + glob-to-regexp@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== glob@7.1.6: version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== dependencies: fs.realpath "^1.0.0" @@ -367,100 +334,100 @@ glob@7.1.6: graceful-fs@^4.1.2: version "4.2.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== has@^1.0.3: version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: function-bind "^1.1.1" ieee754@^1.2.1: version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== inflight@^1.0.4: version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== dependencies: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.3: +inherits@^2.0.3, inherits@2: version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== is-binary-path@~2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== dependencies: binary-extensions "^2.0.0" is-core-module@^2.11.0: version "2.12.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz" integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== dependencies: has "^1.0.3" is-extglob@^2.1.1: version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: is-extglob "^2.1.1" is-number@^7.0.0: version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== jiti@^1.18.2: version "1.19.1" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.19.1.tgz#fa99e4b76a23053e0e7cde098efe1704a14c16f1" + resolved "https://registry.npmjs.org/jiti/-/jiti-1.19.1.tgz" integrity sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg== "js-tokens@^3.0.0 || ^4.0.0": version "4.0.0" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== lilconfig@^2.0.5, lilconfig@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz" integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== lines-and-columns@^1.1.6: version "1.2.4" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== loose-envify@^1.1.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + 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" merge2@^1.3.0: version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== micromatch@^4.0.4, micromatch@^4.0.5: version "4.0.5" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== dependencies: braces "^3.0.2" @@ -468,19 +435,19 @@ micromatch@^4.0.4, micromatch@^4.0.5: minimatch@^3.0.4: version "3.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== dependencies: brace-expansion "^1.1.7" ms@2.1.2: version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== mz@^2.7.0: version "2.7.0" - resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz" integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== dependencies: any-promise "^1.0.0" @@ -489,15 +456,15 @@ mz@^2.7.0: nanoid@^3.3.4, nanoid@^3.3.6: version "3.3.6" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz" integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== next@^13.4.9: - version "13.4.10" - resolved "https://registry.yarnpkg.com/next/-/next-13.4.10.tgz#a5b50696759c61663d5a1dd726995fa0576a382e" - integrity sha512-4ep6aKxVTQ7rkUW2fBLhpBr/5oceCuf4KmlUpvG/aXuDTIf9mexNSpabUD6RWPspu6wiJJvozZREhXhueYO36A== + version "13.4.9" + resolved "https://registry.npmjs.org/next/-/next-13.4.9.tgz" + integrity sha512-vtefFm/BWIi/eWOqf1GsmKG3cjKw1k3LjuefKRcL3iiLl3zWzFdPG3as6xtxrGO6gwTzzaO1ktL4oiHt/uvTjA== dependencies: - "@next/env" "13.4.10" + "@next/env" "13.4.9" "@swc/helpers" "0.5.1" busboy "1.6.0" caniuse-lite "^1.0.30001406" @@ -506,81 +473,81 @@ next@^13.4.9: watchpack "2.4.0" zod "3.21.4" optionalDependencies: - "@next/swc-darwin-arm64" "13.4.10" - "@next/swc-darwin-x64" "13.4.10" - "@next/swc-linux-arm64-gnu" "13.4.10" - "@next/swc-linux-arm64-musl" "13.4.10" - "@next/swc-linux-x64-gnu" "13.4.10" - "@next/swc-linux-x64-musl" "13.4.10" - "@next/swc-win32-arm64-msvc" "13.4.10" - "@next/swc-win32-ia32-msvc" "13.4.10" - "@next/swc-win32-x64-msvc" "13.4.10" + "@next/swc-darwin-arm64" "13.4.9" + "@next/swc-darwin-x64" "13.4.9" + "@next/swc-linux-arm64-gnu" "13.4.9" + "@next/swc-linux-arm64-musl" "13.4.9" + "@next/swc-linux-x64-gnu" "13.4.9" + "@next/swc-linux-x64-musl" "13.4.9" + "@next/swc-win32-arm64-msvc" "13.4.9" + "@next/swc-win32-ia32-msvc" "13.4.9" + "@next/swc-win32-x64-msvc" "13.4.9" node-releases@^2.0.12: version "2.0.13" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz" integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== normalize-range@^0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" + resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== object-assign@^4.0.1: version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== object-hash@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" + resolved "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz" integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== once@^1.3.0: version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== dependencies: wrappy "1" path-is-absolute@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== path-parse@^1.0.7: version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== picocolors@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== pify@^2.3.0: version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== pirates@^4.0.1: version "4.0.6" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz" integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== postcss-import@^15.1.0: version "15.1.0" - resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" + resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz" integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== dependencies: postcss-value-parser "^4.0.0" @@ -589,14 +556,14 @@ postcss-import@^15.1.0: postcss-js@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" + resolved "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz" integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== dependencies: camelcase-css "^2.0.1" postcss-load-config@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.1.tgz#152383f481c2758274404e4962743191d73875bd" + resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz" integrity sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA== dependencies: lilconfig "^2.0.5" @@ -604,14 +571,14 @@ postcss-load-config@^4.0.1: postcss-nested@^6.0.1: version "6.0.1" - resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.1.tgz#f83dc9846ca16d2f4fa864f16e9d9f7d0961662c" + resolved "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz" integrity sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== dependencies: postcss-selector-parser "^6.0.11" postcss-selector-parser@^6.0.11: version "6.0.13" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz" integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== dependencies: cssesc "^3.0.0" @@ -619,78 +586,69 @@ postcss-selector-parser@^6.0.11: postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@8.4.14: - version "8.4.14" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.14.tgz#ee9274d5622b4858c1007a74d76e42e56fd21caf" - integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig== - dependencies: - nanoid "^3.3.4" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -postcss@8.4.25: +postcss@^8.0.0, postcss@^8.1.0, postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.23, postcss@>=8.0.9, postcss@8.4.25: version "8.4.25" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.25.tgz#4a133f5e379eda7f61e906c3b1aaa9b81292726f" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.25.tgz" integrity sha512-7taJ/8t2av0Z+sQEvNzCkpDynl0tX3uJMCODi6nT3PfASC7dYCWV9aQ+uiCf+KBD4SEFcu+GvJdGdwzQ6OSjCw== dependencies: nanoid "^3.3.6" picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@^8.4.23: - version "8.4.26" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.26.tgz#1bc62ab19f8e1e5463d98cf74af39702a00a9e94" - integrity sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw== +postcss@8.4.14: + version "8.4.14" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz" + integrity sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig== dependencies: - nanoid "^3.3.6" + nanoid "^3.3.4" picocolors "^1.0.0" source-map-js "^1.0.2" prettier@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.0.0.tgz#e7b19f691245a21d618c68bc54dc06122f6105ae" + resolved "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz" integrity sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g== queue-microtask@^1.2.2, queue-microtask@^1.2.3: version "1.2.3" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== randombytes@^2.1.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== dependencies: safe-buffer "^5.1.0" react-dom@^18.2.0: version "18.2.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz" integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== dependencies: loose-envify "^1.1.0" scheduler "^0.23.0" -react@^18.2.0: +react@^18.2.0, "react@>= 16.8.0 || 17.x.x || ^18.0.0-0": version "18.2.0" - resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" + resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== dependencies: loose-envify "^1.1.0" read-cache@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + resolved "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz" integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== dependencies: pify "^2.3.0" readable-stream@^3.6.0: version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" @@ -699,14 +657,14 @@ readable-stream@^3.6.0: readdirp@~3.6.0: version "3.6.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== dependencies: picomatch "^2.2.1" resolve@^1.1.7, resolve@^1.22.2: version "1.22.2" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz" integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== dependencies: is-core-module "^2.11.0" @@ -715,31 +673,31 @@ resolve@^1.1.7, resolve@^1.22.2: reusify@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== run-parallel@^1.1.9: version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== dependencies: queue-microtask "^1.2.2" safe-buffer@^5.1.0, safe-buffer@~5.2.0: version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== scheduler@^0.23.0: version "0.23.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz" integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== dependencies: loose-envify "^1.1.0" simple-peer@^9.11.1: version "9.11.1" - resolved "https://registry.yarnpkg.com/simple-peer/-/simple-peer-9.11.1.tgz#9814d5723f821b778b7fb011bdefcbd1e788e6cc" + resolved "https://registry.npmjs.org/simple-peer/-/simple-peer-9.11.1.tgz" integrity sha512-D1SaWpOW8afq1CZGWB8xTfrT3FekjQmPValrqncJMX7QFl8YwhrPTZvMCANLtgBwwdS+7zURyqxDDEmY558tTw== dependencies: buffer "^6.0.3" @@ -752,32 +710,32 @@ simple-peer@^9.11.1: source-map-js@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== streamsearch@^1.1.0: version "1.1.0" - resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz" integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== string_decoder@^1.1.1: version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: safe-buffer "~5.2.0" styled-jsx@5.1.1: version "5.1.1" - resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.1.tgz#839a1c3aaacc4e735fed0781b8619ea5d0009d1f" + resolved "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz" integrity sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw== dependencies: client-only "0.0.1" sucrase@^3.32.0: - version "3.33.0" - resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.33.0.tgz#092c8d2f99a191f2cd9f1fdd52113772f4241f6e" - integrity sha512-ARGC7vbufOHfpvyGcZZXFaXCMZ9A4fffOGC5ucOW7+WHDGlAe8LJdf3Jts1sWhDeiI1RSWrKy5Hodl+JWGdW2A== + version "3.32.0" + resolved "https://registry.npmjs.org/sucrase/-/sucrase-3.32.0.tgz" + integrity sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ== dependencies: "@jridgewell/gen-mapping" "^0.3.2" commander "^4.0.0" @@ -789,18 +747,18 @@ sucrase@^3.32.0: supports-color@^9.4.0: version "9.4.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-9.4.0.tgz#17bfcf686288f531db3dea3215510621ccb55954" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz" integrity sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw== supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== tailwindcss@^3.3.2: - version "3.3.3" - resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.3.3.tgz#90da807393a2859189e48e9e7000e6880a736daf" - integrity sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w== + version "3.3.2" + resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.2.tgz" + integrity sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w== dependencies: "@alloc/quick-lru" "^5.2.0" arg "^5.0.2" @@ -822,43 +780,44 @@ tailwindcss@^3.3.2: postcss-load-config "^4.0.1" postcss-nested "^6.0.1" postcss-selector-parser "^6.0.11" + postcss-value-parser "^4.2.0" resolve "^1.22.2" sucrase "^3.32.0" thenify-all@^1.0.0: version "1.6.0" - resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + resolved "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz" integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== dependencies: thenify ">= 3.1.0 < 4" "thenify@>= 3.1.0 < 4": version "3.3.1" - resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + resolved "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz" integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== dependencies: any-promise "^1.0.0" to-regex-range@^5.0.1: version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== dependencies: is-number "^7.0.0" ts-interface-checker@^0.1.9: version "0.1.13" - resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" + resolved "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz" integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== tslib@^2.4.0: version "2.6.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.0.tgz#b295854684dbda164e181d259a22cd779dcd7bc3" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz" integrity sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA== update-browserslist-db@^1.0.11: version "1.0.11" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz" integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== dependencies: escalade "^3.1.1" @@ -866,12 +825,12 @@ update-browserslist-db@^1.0.11: util-deprecate@^1.0.1, util-deprecate@^1.0.2: version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== watchpack@2.4.0: version "2.4.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz" integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== dependencies: glob-to-regexp "^0.4.1" @@ -879,15 +838,15 @@ watchpack@2.4.0: wrappy@1: version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== yaml@^2.1.1: version "2.3.1" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.1.tgz#02fe0975d23cd441242aa7204e09fc28ac2ac33b" + resolved "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz" integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ== zod@3.21.4: version "3.21.4" - resolved "https://registry.yarnpkg.com/zod/-/zod-3.21.4.tgz#10882231d992519f0a10b5dd58a38c9dabbb64db" + resolved "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz" integrity sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw== From e6e08b8b6f309204395424b508ff822cdc59410f Mon Sep 17 00:00:00 2001 From: Koper Date: Wed, 19 Jul 2023 13:17:51 +0700 Subject: [PATCH 14/41] Create ProjectArchitecture.jpg --- ProjectArchitecture.jpg | Bin 0 -> 363634 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 ProjectArchitecture.jpg diff --git a/ProjectArchitecture.jpg b/ProjectArchitecture.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d08f4b031de08a76004605c9495b832aa82b795a GIT binary patch literal 363634 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

te;G>uHP8K@lj^^|cmybvk!@zdK^VkWEx$j{ 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 G8u%YGI9*`? literal 0 HcmV?d00001 From acaaec0c401b666ed12bd7e5a3ee79907d8a25a6 Mon Sep 17 00:00:00 2001 From: Jose B Date: Wed, 19 Jul 2023 01:44:36 -0500 Subject: [PATCH 15/41] use wavesurfer, extend class, improve front --- app/components/CustomRecordPlugin.js | 44 ++++++++++ app/components/audioVisualizer.js | 63 -------------- app/components/record.js | 124 +++++++++++++++++++++------ app/globals.css | 4 +- app/page.js | 44 ++-------- package.json | 4 +- public/button.css | 2 +- yarn.lock | 17 ++++ 8 files changed, 170 insertions(+), 132 deletions(-) create mode 100644 app/components/CustomRecordPlugin.js delete mode 100644 app/components/audioVisualizer.js diff --git a/app/components/CustomRecordPlugin.js b/app/components/CustomRecordPlugin.js new file mode 100644 index 00000000..6ec25fd4 --- /dev/null +++ b/app/components/CustomRecordPlugin.js @@ -0,0 +1,44 @@ +// Override the startRecording method so we can pass the desired stream +// Checkout: https://github.com/katspaugh/wavesurfer.js/blob/fa2bcfe/src/plugins/record.ts + +import RecordPlugin from "wavesurfer.js/dist/plugins/record" + +const MIME_TYPES = ['audio/webm', 'audio/wav', 'audio/mpeg', 'audio/mp4', 'audio/mp3'] +const findSupportedMimeType = () => MIME_TYPES.find((mimeType) => MediaRecorder.isTypeSupported(mimeType)) + +class CustomRecordPlugin extends RecordPlugin { + static create(options) { + return new CustomRecordPlugin(options || {}) + } + startRecording(stream) { + this.preventInteraction() + this.cleanUp() + + const onStop = this.render(stream) + const mediaRecorder = new MediaRecorder(stream, { + mimeType: this.options.mimeType || findSupportedMimeType(), + audioBitsPerSecond: this.options.audioBitsPerSecond, + }) + const recordedChunks = [] + + mediaRecorder.addEventListener('dataavailable', (event) => { + if (event.data.size > 0) { + recordedChunks.push(event.data) + } + }) + + mediaRecorder.addEventListener('stop', () => { + onStop() + this.loadBlob(recordedChunks, mediaRecorder.mimeType) + this.emit('stopRecording') + }) + + mediaRecorder.start() + + this.emit('startRecording') + + this.mediaRecorder = mediaRecorder + } +} + +export default CustomRecordPlugin; \ No newline at end of file diff --git a/app/components/audioVisualizer.js b/app/components/audioVisualizer.js deleted file mode 100644 index fedaa5da..00000000 --- a/app/components/audioVisualizer.js +++ /dev/null @@ -1,63 +0,0 @@ -import React, { useRef, useEffect } from "react"; - -function AudioVisualizer(props) { - const canvasRef = useRef(null); - - useEffect(() => { - let animationFrameId; - - const canvas = canvasRef.current; - const context = canvas.getContext("2d"); - const analyser = new AnalyserNode(new AudioContext()); - - navigator.mediaDevices.getUserMedia({ audio: true }).then((stream) => { - const audioContext = new (window.AudioContext || - window.webkitAudioContext)(); - const source = audioContext.createMediaStreamSource(stream); - const analyser = audioContext.createAnalyser(); - analyser.fftSize = 2048; - source.connect(analyser); - - const bufferLength = analyser.frequencyBinCount; - const dataArray = new Uint8Array(bufferLength); - const barWidth = (canvas.width / bufferLength) * 2.5; - let barHeight; - let x = 0; - - function renderFrame() { - x = 0; - analyser.getByteFrequencyData(dataArray); - context.fillStyle = "#000"; - context.fillRect(0, 0, canvas.width, canvas.height); - - for (let i = 0; i < bufferLength; i++) { - barHeight = dataArray[i]; - - const red = 255; - const green = 250 * (i / bufferLength); - const blue = barHeight + 25 * (i / bufferLength); - - context.fillStyle = `rgb(${red},${green},${blue})`; - context.fillRect( - x, - canvas.height - barHeight / 2, - barWidth, - barHeight / 2, - ); - - x += barWidth + 1; - } - animationFrameId = requestAnimationFrame(renderFrame); - } - renderFrame(); - }); - - return () => cancelAnimationFrame(animationFrameId); - }, []); - - return ( - - ); -} - -export default AudioVisualizer; diff --git a/app/components/record.js b/app/components/record.js index 26bcc984..3e5a17f5 100644 --- a/app/components/record.js +++ b/app/components/record.js @@ -1,36 +1,106 @@ -import AudioVisualizer from "./audioVisualizer.js"; +import React, { useRef, useEffect, useState } from "react"; + +import WaveSurfer from "wavesurfer.js"; + +import Dropdown from 'react-dropdown' +import 'react-dropdown/style.css' + +import CustomRecordPlugin from './CustomRecordPlugin' + export default function Recorder(props) { - let mediaRecorder = null; // mediaRecorder instance + const waveformRef = useRef() + const [wavesurfer, setWavesurfer] = useState(null) + const [record, setRecord] = useState(null) + const [isRecording, setIsRecording] = useState(false) + const [isPlaying, setIsPlaying] = useState(false) + const [deviceId, setDeviceId] = useState(null) + const [ddOptions, setDdOptions] = useState([]) - const startRecording = () => { - navigator.mediaDevices.getUserMedia({ audio: true }).then((stream) => { - mediaRecorder = new MediaRecorder(stream); - mediaRecorder.start(); - props.onRecord(true); - }); - }; + useEffect(() => { + document.getElementById('play-btn').disabled = true - const stopRecording = () => { - if (mediaRecorder) { - mediaRecorder.stop(); - props.onRecord(false); + navigator.mediaDevices.enumerateDevices().then(devices => { + const audioDevices = devices + .filter(d => d.kind === 'audioinput') + .map(d => ({value: d.deviceId, label: d.label})) + + if (audioDevices.length < 1) return console.log("no audio input devices") + + setDdOptions(audioDevices) + setDeviceId(audioDevices[0].value) + }) + + if(waveformRef.current) { + const _wavesurfer = WaveSurfer.create({ + container: waveformRef.current, + waveColor: "#333", + progressColor: "#0178FF", + cursorColor: "OrangeRed", + hideScrollbar: true, + autoCenter: true, + barWidth: 2, + }) + const wsWrapper = _wavesurfer.getWrapper() + wsWrapper.style.cursor = 'pointer' + wsWrapper.style.backgroundColor = 'lightgray' + wsWrapper.style.borderRadius = '15px' + + _wavesurfer.on('play', () => { + setIsPlaying(true) + }) + _wavesurfer.on('pause', () => { + setIsPlaying(false) + }) + + setRecord(_wavesurfer.registerPlugin(CustomRecordPlugin.create())) + setWavesurfer(_wavesurfer) + return () => { + _wavesurfer.destroy() + setIsRecording(false) + setIsPlaying(false) + } } - }; + }, []) + + const handleRecClick = async () => { + if (!record) return console.log("no record") + + if(record?.isRecording()) { + record.stopRecording() + setIsRecording(false) + document.getElementById('play-btn').disabled = false + } else { + const stream = await navigator.mediaDevices.getUserMedia({ audio: { deviceId } }) + await record.startRecording(stream) + props.setStream(stream) + setIsRecording(true) + } + } + + const handlePlayClick = () => { + wavesurfer?.playPause() + } + + const handleDropdownChange = (e) => { + setDeviceId(e.value) + } return ( -

- {props.isRecording && } - - {props.isRecording ? ( - - ) : ( - - )} + + ) } diff --git a/app/globals.css b/app/globals.css index 168f6514..d45723bd 100644 --- a/app/globals.css +++ b/app/globals.css @@ -11,8 +11,8 @@ @media (prefers-color-scheme: dark) { :root { --foreground-rgb: 255, 255, 255; - --background-start-rgb: 0, 0, 0; - --background-end-rgb: 0, 0, 0; + --background-start-rgb: 32, 32, 32; + --background-end-rgb: 32, 32, 32; } } diff --git a/app/page.js b/app/page.js index 5130b47a..0b837da3 100644 --- a/app/page.js +++ b/app/page.js @@ -1,39 +1,16 @@ "use client"; -import React, { useState, useEffect } from "react"; +import React, { useState } from "react"; import Recorder from "./components/record.js"; import { Dashboard } from "./components/dashboard.js"; import useWebRTC from "./components/webrtc.js"; import "../public/button.css"; const App = () => { - const [isRecording, setIsRecording] = useState(false); - const [splashScreen, setSplashScreen] = useState(true); - - const handleRecord = (recording) => { - console.log("handleRecord", recording); - - setIsRecording(recording); - setSplashScreen(false); - - if (recording) { - navigator.mediaDevices - .getUserMedia({ audio: true }) - .then(setStream) - .catch((err) => console.error(err)); - } else if (!recording) { - if (stream) { - const tracks = stream.getTracks(); - tracks.forEach((track) => track.stop()); - setStream(null); - } - - setIsRecording(false); - } - }; - const [stream, setStream] = useState(null); + + // This is where you'd send the stream and receive the data from the server. + // transcription, summary, etc const serverData = useWebRTC(stream); - console.log(serverData); return (
@@ -42,17 +19,8 @@ const App = () => {

Capture The Signal, Not The Noise

- handleRecord(recording)} - /> - - {!splashScreen && ( - handleRecord(recording)} - /> - )} + +
Reflector © 2023 Monadical diff --git a/package.json b/package.json index 228e4608..40c90b86 100644 --- a/package.json +++ b/package.json @@ -15,9 +15,11 @@ "postcss": "8.4.25", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-dropdown": "^1.11.0", "simple-peer": "^9.11.1", "supports-color": "^9.4.0", - "tailwindcss": "^3.3.2" + "tailwindcss": "^3.3.2", + "wavesurfer.js": "^7.0.3" }, "main": "index.js", "repository": "https://github.com/Monadical-SAS/reflector-ui.git", diff --git a/public/button.css b/public/button.css index 7ce20d89..2f643722 100644 --- a/public/button.css +++ b/public/button.css @@ -45,7 +45,7 @@ button.block { input[type="button"][disabled], button[disabled] { border-color: #ccc; - background-color: #eee; + background: #b8b8b8 !important; cursor: not-allowed; } diff --git a/yarn.lock b/yarn.lock index 7b8ebf7a..d07c5ade 100644 --- a/yarn.lock +++ b/yarn.lock @@ -232,6 +232,11 @@ chokidar@^3.5.3: optionalDependencies: fsevents "~2.3.2" +classnames@^2.2.3: + version "2.3.2" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" + integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== + client-only@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" @@ -674,6 +679,13 @@ react-dom@^18.2.0: loose-envify "^1.1.0" scheduler "^0.23.0" +react-dropdown@^1.11.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/react-dropdown/-/react-dropdown-1.11.0.tgz#b9576de17efd28e5684d101b3f58dfe784af242c" + integrity sha512-E2UWetRPxNdIhQahXw6b984ME7WmcgDj9AEAjrtS/oyLCFVo+2qkCfcS06C22JR0Zj+YLnygwv0Ozf6VKKDq7g== + dependencies: + classnames "^2.2.3" + react@^18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" @@ -877,6 +889,11 @@ watchpack@2.4.0: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" +wavesurfer.js@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/wavesurfer.js/-/wavesurfer.js-7.0.3.tgz#d3e0b07056c08d43db19d4950d2de68681f48606" + integrity sha512-gJ3P+Bd3Q4E8qETjjg0pneaVqm2J7jegG2Cc6vqEF5YDDKQ3m8sKsvVfgVhJkacKkO9jFAGDu58Hw4zLr7xD0A== + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" From ca75871cd5fc04a17cb114f52524eedb9734e4d3 Mon Sep 17 00:00:00 2001 From: Koper Date: Wed, 19 Jul 2023 20:43:09 +0700 Subject: [PATCH 16/41] Added actual transcription text to GUI for debug purposes --- app/components/dashboard.js | 2 +- app/globals.css | 6 ++++++ app/page.js | 3 ++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/app/components/dashboard.js b/app/components/dashboard.js index 952c7f47..154dd076 100644 --- a/app/components/dashboard.js +++ b/app/components/dashboard.js @@ -148,7 +148,7 @@ export function Dashboard(props) { {generateDecibelGraph(generateDecibelData())}
-
{liveTranscript}
+
{props.transcriptionText}
diff --git a/app/globals.css b/app/globals.css index 168f6514..2d8b5900 100644 --- a/app/globals.css +++ b/app/globals.css @@ -27,3 +27,9 @@ body { font-family: "Roboto", sans-serif; } + +.temp-transcription +{ + background: beige; + border-radius: 5px; +} diff --git a/app/page.js b/app/page.js index 563a9942..a0d9cd65 100644 --- a/app/page.js +++ b/app/page.js @@ -33,7 +33,7 @@ const App = () => { const [stream, setStream] = useState(null); const serverData = useWebRTC(stream); - console.log(serverData); + const text = serverData?.text ?? ""; return (
@@ -47,6 +47,7 @@ const App = () => { handleRecord(recording)} + transcriptionText={`[${serverData?.timestamp?.substring(2) ?? "??"}] ${text}`} /> )}
From 0cf929dfa8c518de9717d77f7ab072c323e6b5da Mon Sep 17 00:00:00 2001 From: Koper Date: Thu, 20 Jul 2023 00:40:11 +0700 Subject: [PATCH 17/41] Full back end integration --- app/components/dashboard.js | 116 +++++++++--------------------- app/components/record.js | 21 +----- app/components/webrtc.js | 54 +++++++++----- app/{globals.css => globals.scss} | 5 +- app/layout.js | 2 +- app/page.js | 15 ++-- package-lock.json | 22 ++++++ package.json | 1 + yarn.lock | 18 ++++- 9 files changed, 120 insertions(+), 134 deletions(-) rename app/{globals.css => globals.scss} (90%) diff --git a/app/components/dashboard.js b/app/components/dashboard.js index 154dd076..198450c8 100644 --- a/app/components/dashboard.js +++ b/app/components/dashboard.js @@ -2,41 +2,21 @@ import { Mulberry32 } from "../utils.js"; import React, { useState, useEffect } from "react"; import AudioVisualizer from "./audioVisualizer.js"; -export function Dashboard(props) { +export function Dashboard({ + isRecording, + onRecord, + transcriptionText, + finalSummary, + topics, + stream, +}) { const [openIndex, setOpenIndex] = useState(null); const [liveTranscript, setLiveTranscript] = useState(""); - const [fakeTranscriptIndex, setFakeTranscriptIndex] = useState(0); - - const fakeTranscripts = [ - "This is the first transcript. We are discussing the current situation of our company. We are currently leading the market with a significant margin, and our future outlook is also very promising...", - "Here is the second transcript. We are now moving to our next topic, which is the progress in our ongoing projects. Most of them are on schedule and the quality of work is up to our standard...", - "This is the third transcript. It's about the financial status of our company. We are doing quite well financially. The revenue for this quarter is higher than expected...", - // add more fake transcripts as needed - ]; - - useEffect(() => { - // Randomly select a fake transcript - const selectedTranscript = - fakeTranscripts[Math.floor(Math.random() * fakeTranscripts.length)]; - // Split the selected transcript into characters - const characters = Array.from(selectedTranscript); - - let counter = 0; - let liveTranscriptCopy = ""; - let intervalId = setInterval(() => { - if (counter < characters.length) { - liveTranscriptCopy += characters[counter]; - setLiveTranscript(liveTranscriptCopy); - counter++; - } else { - clearInterval(intervalId); - } - }, 50); // delay of 100ms - - // Cleanup function to clear the interval when the component unmounts - return () => clearInterval(intervalId); - }, []); + topics = topics.map((topic, i) => { + topic["decibel"] = generateDecibelData(i + 1 + 333); // for looks only + return topic; + }); const generateDecibelData = (x) => { let data = []; @@ -58,50 +38,6 @@ export function Dashboard(props) { )); }; - // This is hardcoded data for proof of concept - const data = [ - { - timestamp: "00:00", - topic: "Meeting Introduction", - decibel: generateDecibelData(1), - transcript: - "This is the meeting introduction, we will be discussing several important topics today.", - }, - { - timestamp: "00:48", - topic: "Discussing Quarterly Revenue", - decibel: generateDecibelData(2), - transcript: - "We are discussing the quarterly revenue here, it appears our revenue has grown by 15% compared to the previous quarter.", - }, - { - timestamp: "01:35", - topic: "Annual Sales Review", - decibel: generateDecibelData(3), - transcript: - "Now we're reviewing the annual sales, there was a significant boost during the holiday season.", - }, - { - timestamp: "02:20", - topic: "Operational Costs Analysis", - decibel: generateDecibelData(4), - transcript: - "Moving on to the operational costs analysis, we have managed to reduce unnecessary expenses.", - }, - { - timestamp: "03:10", - topic: "Employee Performance", - decibel: generateDecibelData(5), - transcript: - "Let's talk about the employee performance, overall the team has done a great job.", - }, - /* { timestamp: '03:45', topic: 'New Marketing Strategies', decibel: generateDecibelData(6), transcript: "Our marketing team has proposed some new strategies that we'll discuss now." }, - { timestamp: '04:30', topic: 'Customer Feedback', decibel: generateDecibelData(7), transcript: "Let's go through some customer feedback that we've received." }, - { timestamp: '05:15', topic: 'Product Development', decibel: generateDecibelData(8), transcript: "Product development is going well and the new product line will be ready to launch next quarter." }, - { timestamp: '06:00', topic: 'Discussing Future Projects', decibel: generateDecibelData(9), transcript: "Now we are talking about the future projects, we have some exciting projects lined up." }, - { timestamp: '06:45', topic: 'Meeting Conclusion', decibel: generateDecibelData(10), transcript: "As we conclude the meeting, I want to thank everyone for their hard work and dedication." }, */ - ]; - return ( <>
@@ -114,7 +50,8 @@ export function Dashboard(props) {
Topic
- {data.map((item, index) => ( + + {topics.map((item, index) => (
{item.timestamp}
- {item.topic}{" "} + {item.title}{" "}
{openIndex === index && ( -
{item.transcript}
+
{item.description}
)}
))} +
Live
@@ -148,18 +86,28 @@ export function Dashboard(props) { {generateDecibelGraph(generateDecibelData())}
-
{props.transcriptionText}
+
+ {transcriptionText} +
- + + {finalSummary && ( +
+

Final Summary

+

Duration: {finalSummary.duration}

+

{finalSummary.summary}

+
+ )} +
Reflector © 2023 Monadical
diff --git a/app/components/record.js b/app/components/record.js index 03c9c4aa..a3d3e17f 100644 --- a/app/components/record.js +++ b/app/components/record.js @@ -1,21 +1,4 @@ export default function Record(props) { - let mediaRecorder = null; // mediaRecorder instance - - const startRecording = () => { - navigator.mediaDevices.getUserMedia({ audio: true }).then((stream) => { - mediaRecorder = new MediaRecorder(stream); - mediaRecorder.start(); - props.onRecord(true); - }); - }; - - const stopRecording = () => { - if (mediaRecorder) { - mediaRecorder.stop(); - props.onRecord(false); - } - }; - return (
@@ -25,11 +8,11 @@ export default function Record(props) {
{!props.isRecording ? ( - ) : ( - )} diff --git a/app/components/webrtc.js b/app/components/webrtc.js index f13e8356..88fd2b7b 100644 --- a/app/components/webrtc.js +++ b/app/components/webrtc.js @@ -3,16 +3,17 @@ import Peer from "simple-peer"; const WebRTC_SERVER_URL = "http://127.0.0.1:1250/offer"; -const useWebRTC = (stream) => { - const [data, setData] = useState(null); +const useWebRTC = (stream, setIsRecording) => { + const [data, setData] = useState({}); useEffect(() => { + if (!stream) { + return; + } + let peer = new Peer({ initiator: true, stream: stream }); peer.on("signal", (data) => { - // This is where you'd send the signal data to the server. - // The server would then send it back to other peers who would then - // use `peer.signal()` method to continue the connection negotiation. if ("sdp" in data) { fetch(WebRTC_SERVER_URL, { body: JSON.stringify({ @@ -24,13 +25,9 @@ const useWebRTC = (stream) => { }, method: "POST", }) - .then(function (response) { - return response.json(); - }) - .then(function (answer) { - return peer.signal(answer); - }) - .catch(function (e) { + .then((response) => response.json()) + .then((answer) => peer.signal(answer)) + .catch((e) => { alert(e); }); } @@ -41,17 +38,40 @@ const useWebRTC = (stream) => { }); peer.on("data", (data) => { - // Received data from the server. - console.log(data.toString()); const serverData = JSON.parse(data.toString()); - setData(serverData); + + switch (serverData.cmd) { + case "SHOW_TRANSCRIPTION": + setData((prevData) => ({ + ...prevData, + text: serverData.text, + })); + break; + case "UPDATE_TOPICS": + setData((prevData) => ({ + ...prevData, + topics: serverData.topics, + })); + break; + case "DISPLAY_FINAL_SUMMARY": + setData((prevData) => ({ + ...prevData, + finalSummary: { + duration: serverData.duration, + summary: serverData.summary, + }, + })); + setIsRecording(false); + break; + default: + console.error(`Unknown command ${serverData.cmd}`); + } }); - // Clean up return () => { peer.destroy(); }; - }, [stream]); + }, [stream, setIsRecording]); return data; }; diff --git a/app/globals.css b/app/globals.scss similarity index 90% rename from app/globals.css rename to app/globals.scss index 2d8b5900..abe75d80 100644 --- a/app/globals.css +++ b/app/globals.scss @@ -17,7 +17,7 @@ } body { - color: rgb(var(--foreground-rgb)); + color: black; background: linear-gradient( to bottom, transparent, @@ -28,8 +28,7 @@ body { font-family: "Roboto", sans-serif; } -.temp-transcription -{ +.temp-transcription { background: beige; border-radius: 5px; } diff --git a/app/layout.js b/app/layout.js index df1a0ac7..0e91a9e4 100644 --- a/app/layout.js +++ b/app/layout.js @@ -1,4 +1,4 @@ -import "./globals.css"; +import "./globals.scss"; import { Roboto } from "next/font/google"; import Head from "next/head"; diff --git a/app/page.js b/app/page.js index a0d9cd65..ea3fee00 100644 --- a/app/page.js +++ b/app/page.js @@ -1,5 +1,5 @@ "use client"; -import React, { useState, useEffect } from "react"; +import React, { useState } from "react"; import Record from "./components/record.js"; import { Dashboard } from "./components/dashboard.js"; import useWebRTC from "./components/webrtc.js"; @@ -8,10 +8,9 @@ import "../public/button.css"; const App = () => { const [isRecording, setIsRecording] = useState(false); const [splashScreen, setSplashScreen] = useState(true); + const [stream, setStream] = useState(null); const handleRecord = (recording) => { - console.log("handleRecord", recording); - setIsRecording(recording); setSplashScreen(false); @@ -26,13 +25,10 @@ const App = () => { tracks.forEach((track) => track.stop()); setStream(null); } - - setIsRecording(false); } }; - const [stream, setStream] = useState(null); - const serverData = useWebRTC(stream); + const serverData = useWebRTC(stream, setIsRecording); const text = serverData?.text ?? ""; return ( @@ -47,7 +43,10 @@ const App = () => { handleRecord(recording)} - transcriptionText={`[${serverData?.timestamp?.substring(2) ?? "??"}] ${text}`} + transcriptionText={text ?? "(No transcription text)"} + finalSummary={serverData.finalSummary} + topics={serverData.topics ?? []} + stream={stream} /> )}
diff --git a/package-lock.json b/package-lock.json index cb583783..e2b473d8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "postcss": "8.4.25", "react": "^18.2.0", "react-dom": "^18.2.0", + "sass": "^1.63.6", "simple-peer": "^9.11.1", "supports-color": "^9.4.0", "tailwindcss": "^3.3.2" @@ -724,6 +725,11 @@ } ] }, + "node_modules/immutable": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.1.tgz", + "integrity": "sha512-lj9cnmB/kVS0QHsJnYKD1uo3o39nrbKxszjnqS9Fr6NB7bZzW45U6WSGBPKXDL/CvDKqDNPA4r3DoDQ8GTxo2A==" + }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -1337,6 +1343,22 @@ } ] }, + "node_modules/sass": { + "version": "1.63.6", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.63.6.tgz", + "integrity": "sha512-MJuxGMHzaOW7ipp+1KdELtqKbfAWbH7OLIdoSMnVe3EXPMTmxTmlaZDCTsgIpPCs3w99lLo9/zDKkOrJuT5byw==", + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/scheduler": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", diff --git a/package.json b/package.json index 228e4608..46ad0c7e 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "postcss": "8.4.25", "react": "^18.2.0", "react-dom": "^18.2.0", + "sass": "^1.63.6", "simple-peer": "^9.11.1", "supports-color": "^9.4.0", "tailwindcss": "^3.3.2" diff --git a/yarn.lock b/yarn.lock index 3ac29930..69869ae8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -177,7 +177,7 @@ caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001464, caniuse-lite@^1.0.300015 resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001515.tgz" integrity sha512-eEFDwUOZbE24sb+Ecsx3+OvNETqjWIdabMy52oOkIgcUtAsQifjUG9q4U9dgTHJM2mfk4uEPxc0+xuFdJ629QA== -chokidar@^3.5.3: +chokidar@^3.5.3, "chokidar@>=3.0.0 <4.0.0": version "3.5.3" resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== @@ -349,6 +349,11 @@ ieee754@^1.2.1: resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== +immutable@^4.0.0: + version "4.3.1" + resolved "https://registry.npmjs.org/immutable/-/immutable-4.3.1.tgz" + integrity sha512-lj9cnmB/kVS0QHsJnYKD1uo3o39nrbKxszjnqS9Fr6NB7bZzW45U6WSGBPKXDL/CvDKqDNPA4r3DoDQ8GTxo2A== + inflight@^1.0.4: version "1.0.6" resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" @@ -688,6 +693,15 @@ safe-buffer@^5.1.0, safe-buffer@~5.2.0: resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +sass@^1.3.0, sass@^1.63.6: + version "1.63.6" + resolved "https://registry.npmjs.org/sass/-/sass-1.63.6.tgz" + integrity sha512-MJuxGMHzaOW7ipp+1KdELtqKbfAWbH7OLIdoSMnVe3EXPMTmxTmlaZDCTsgIpPCs3w99lLo9/zDKkOrJuT5byw== + dependencies: + chokidar ">=3.0.0 <4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" + scheduler@^0.23.0: version "0.23.0" resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz" @@ -708,7 +722,7 @@ simple-peer@^9.11.1: randombytes "^2.1.0" readable-stream "^3.6.0" -source-map-js@^1.0.2: +source-map-js@^1.0.2, "source-map-js@>=0.6.2 <2.0.0": version "1.0.2" resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== From 9163b5c1e5e2e7ccdec6a7f021e3abb60853b387 Mon Sep 17 00:00:00 2001 From: Koper Date: Thu, 20 Jul 2023 00:44:19 +0700 Subject: [PATCH 18/41] getting rid of legacy code --- app/page.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/page.js b/app/page.js index ea3fee00..b104eb03 100644 --- a/app/page.js +++ b/app/page.js @@ -29,7 +29,6 @@ const App = () => { }; const serverData = useWebRTC(stream, setIsRecording); - const text = serverData?.text ?? ""; return (
@@ -43,7 +42,7 @@ const App = () => { handleRecord(recording)} - transcriptionText={text ?? "(No transcription text)"} + transcriptionText={serverData.text ?? "(No transcription text)"} finalSummary={serverData.finalSummary} topics={serverData.topics ?? []} stream={stream} From 971a173a9b2d9ff291da209ab78bc0ff2945d8e2 Mon Sep 17 00:00:00 2001 From: Koper Date: Thu, 20 Jul 2023 12:53:24 +0700 Subject: [PATCH 19/41] Fixed uninitialized topic variable related to "fake" decibel graph which has been removed --- app/components/dashboard.js | 27 --------------------------- 1 file changed, 27 deletions(-) diff --git a/app/components/dashboard.js b/app/components/dashboard.js index 198450c8..32c91e2e 100644 --- a/app/components/dashboard.js +++ b/app/components/dashboard.js @@ -13,31 +13,6 @@ export function Dashboard({ const [openIndex, setOpenIndex] = useState(null); const [liveTranscript, setLiveTranscript] = useState(""); - topics = topics.map((topic, i) => { - topic["decibel"] = generateDecibelData(i + 1 + 333); // for looks only - return topic; - }); - - const generateDecibelData = (x) => { - let data = []; - let random = Mulberry32(123456789 + x); - for (let i = 0; i < 50; i++) { - data.push(Math.floor(random() * 30) + 10); // generate random values between 10 and 40 - } - return data; - }; - const generateDecibelGraph = (decibelData) => { - return decibelData.map((decibel, i) => ( -
-   -
- )); - }; - return ( <>
@@ -69,7 +44,6 @@ export function Dashboard({
- {generateDecibelGraph(item.decibel)}
{openIndex === index && ( @@ -83,7 +57,6 @@ export function Dashboard({
Live
Transcript
- {generateDecibelGraph(generateDecibelData())}
From 71e5df5dac5db1efd0780e83b3edd1bbff04b95c Mon Sep 17 00:00:00 2001 From: Koper Date: Thu, 20 Jul 2023 15:54:28 +0700 Subject: [PATCH 20/41] Stop command --- app/components/webrtc.js | 5 ++++- app/page.js | 9 +++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/components/webrtc.js b/app/components/webrtc.js index 88fd2b7b..c81f2336 100644 --- a/app/components/webrtc.js +++ b/app/components/webrtc.js @@ -4,7 +4,9 @@ import Peer from "simple-peer"; const WebRTC_SERVER_URL = "http://127.0.0.1:1250/offer"; const useWebRTC = (stream, setIsRecording) => { - const [data, setData] = useState({}); + const [data, setData] = useState({ + peer: null, + }); useEffect(() => { if (!stream) { @@ -35,6 +37,7 @@ const useWebRTC = (stream, setIsRecording) => { peer.on("connect", () => { console.log("WebRTC connected"); + setData(prevData => ({ ...prevData, peer: peer })); }); peer.on("data", (data) => { diff --git a/app/page.js b/app/page.js index b104eb03..1aaf9b6c 100644 --- a/app/page.js +++ b/app/page.js @@ -19,15 +19,12 @@ const App = () => { .getUserMedia({ audio: true }) .then(setStream) .catch((err) => console.error(err)); - } else if (!recording) { - if (stream) { - const tracks = stream.getTracks(); - tracks.forEach((track) => track.stop()); - setStream(null); - } + } else if (!recording && serverData.peer) { + serverData.peer.send(JSON.stringify({ cmd: 'STOP' })); } }; + const serverData = useWebRTC(stream, setIsRecording); return ( From 959b7f4ca459e54f19615a57517417ba10d15fef Mon Sep 17 00:00:00 2001 From: Koper Date: Thu, 20 Jul 2023 18:52:46 +0700 Subject: [PATCH 21/41] Removed dark mode --- app/globals.scss | 9 --------- 1 file changed, 9 deletions(-) diff --git a/app/globals.scss b/app/globals.scss index abe75d80..b16c3c87 100644 --- a/app/globals.scss +++ b/app/globals.scss @@ -8,16 +8,7 @@ --background-end-rgb: 255, 255, 255; } -@media (prefers-color-scheme: dark) { - :root { - --foreground-rgb: 255, 255, 255; - --background-start-rgb: 0, 0, 0; - --background-end-rgb: 0, 0, 0; - } -} - body { - color: black; background: linear-gradient( to bottom, transparent, From 154132e028e78852f73131e9297fe2d1bed19ed2 Mon Sep 17 00:00:00 2001 From: Koper Date: Thu, 20 Jul 2023 22:23:21 +0700 Subject: [PATCH 22/41] Changed the topic description to transcript and added console.log for webrtc incoming messages --- app/components/dashboard.js | 2 +- app/components/webrtc.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/components/dashboard.js b/app/components/dashboard.js index 32c91e2e..f5164d5f 100644 --- a/app/components/dashboard.js +++ b/app/components/dashboard.js @@ -47,7 +47,7 @@ export function Dashboard({
{openIndex === index && ( -
{item.description}
+
{item.transcript}
)} ))} diff --git a/app/components/webrtc.js b/app/components/webrtc.js index 88fd2b7b..73a17931 100644 --- a/app/components/webrtc.js +++ b/app/components/webrtc.js @@ -39,6 +39,7 @@ const useWebRTC = (stream, setIsRecording) => { peer.on("data", (data) => { const serverData = JSON.parse(data.toString()); + console.log(serverData); switch (serverData.cmd) { case "SHOW_TRANSCRIPTION": From 74d1df6dc495727cdccee73f87c7b3f6b5bccb52 Mon Sep 17 00:00:00 2001 From: Koper Date: Fri, 21 Jul 2023 17:37:22 +0700 Subject: [PATCH 23/41] Manual update with main --- app/components/dashboard.js | 19 ++++---- app/components/record.js | 2 +- app/page.js | 36 +++++++++----- package-lock.json | 26 ++++++++++- yarn.lock | 93 ++++++++++++------------------------- 5 files changed, 91 insertions(+), 85 deletions(-) diff --git a/app/components/dashboard.js b/app/components/dashboard.js index 5830c930..dd66c17e 100644 --- a/app/components/dashboard.js +++ b/app/components/dashboard.js @@ -14,7 +14,11 @@ export function Dashboard({ return ( <> -
+
+
+

Reflector

+

Capture The Signal, Not The Noise

+
Timestamp
Topic
@@ -31,9 +35,8 @@ export function Dashboard({
{item.title}{" "} {">"} @@ -42,11 +45,12 @@ export function Dashboard({
{openIndex === index && ( -
{item.transcript}
+
{item.transcript}
)}
))} -
+ +
Live
Transcript
@@ -57,8 +61,7 @@ export function Dashboard({ {transcriptionText}
-
); -} +} \ No newline at end of file diff --git a/app/components/record.js b/app/components/record.js index 01b2c887..6b1ea345 100644 --- a/app/components/record.js +++ b/app/components/record.js @@ -88,7 +88,7 @@ export default function Recorder(props) { return ( -
+
  diff --git a/app/page.js b/app/page.js index 393b8fd2..14993f89 100644 --- a/app/page.js +++ b/app/page.js @@ -6,12 +6,24 @@ import useWebRTC from "./components/webrtc.js"; import "../public/button.css"; const App = () => { + const [isRecording, setIsRecording] = useState(false); const [stream, setStream] = useState(null); - // This is where you'd send the stream and receive the data from the server. - // transcription, summary, etc - const serverData = useWebRTC(stream); - const text = serverData?.text ?? ""; + const handleRecord = (recording) => { + setIsRecording(recording); + + if (recording) { + navigator.mediaDevices + .getUserMedia({ audio: true }) + .then(setStream) + .catch((err) => console.error(err)); + } else if (!recording && serverData.peer) { + serverData.peer.send(JSON.stringify({ cmd: 'STOP' })); + } + }; + + + const serverData = useWebRTC(stream, setIsRecording); return (
@@ -20,17 +32,17 @@ const App = () => {

Capture The Signal, Not The Noise

- + handleRecord(recording)} + transcriptionText={serverData.text ?? "(No transcription text)"} + finalSummary={serverData.finalSummary} + topics={serverData.topics ?? []} + stream={stream} /> - -
- Reflector © 2023 Monadical -
); }; -export default App; +export default App; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index e2b473d8..0b237347 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,10 +14,12 @@ "postcss": "8.4.25", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-dropdown": "^1.11.0", "sass": "^1.63.6", "simple-peer": "^9.11.1", "supports-color": "^9.4.0", - "tailwindcss": "^3.3.2" + "tailwindcss": "^3.3.2", + "wavesurfer.js": "^7.0.3" }, "devDependencies": { "prettier": "^3.0.0" @@ -497,6 +499,11 @@ "node": ">= 6" } }, + "node_modules/classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + }, "node_modules/client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", @@ -1245,6 +1252,18 @@ "react": "^18.2.0" } }, + "node_modules/react-dropdown": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/react-dropdown/-/react-dropdown-1.11.0.tgz", + "integrity": "sha512-E2UWetRPxNdIhQahXw6b984ME7WmcgDj9AEAjrtS/oyLCFVo+2qkCfcS06C22JR0Zj+YLnygwv0Ozf6VKKDq7g==", + "dependencies": { + "classnames": "^2.2.3" + }, + "peerDependencies": { + "react": "^0.14.7 || ^15.0.0-0 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^0.14.7 || ^15.0.0-0 || ^16.0.0 || ^17.0.0|| ^18.0.0" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -1607,6 +1626,11 @@ "node": ">=10.13.0" } }, + "node_modules/wavesurfer.js": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/wavesurfer.js/-/wavesurfer.js-7.0.3.tgz", + "integrity": "sha512-gJ3P+Bd3Q4E8qETjjg0pneaVqm2J7jegG2Cc6vqEF5YDDKQ3m8sKsvVfgVhJkacKkO9jFAGDu58Hw4zLr7xD0A==" + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/yarn.lock b/yarn.lock index 4ade487a..f189842f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -26,16 +26,16 @@ resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== -"@jridgewell/sourcemap-codec@1.4.14": - version "1.4.14" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.15" resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== +"@jridgewell/sourcemap-codec@1.4.14": + version "1.4.14" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + "@jridgewell/trace-mapping@^0.3.9": version "0.3.18" resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz" @@ -54,46 +54,6 @@ resolved "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.9.tgz" integrity sha512-TVzGHpZoVBk3iDsTOQA/R6MGmFp0+17SWXMEWd6zG30AfuELmSSMe2SdPqxwXU0gbpWkJL1KgfLzy5ReN0crqQ== -"@next/swc-darwin-x64@13.4.9": - version "13.4.9" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.9.tgz#a08fccdee68201522fe6618ec81f832084b222f8" - integrity sha512-aSfF1fhv28N2e7vrDZ6zOQ+IIthocfaxuMWGReB5GDriF0caTqtHttAvzOMgJgXQtQx6XhyaJMozLTSEXeNN+A== - -"@next/swc-linux-arm64-gnu@13.4.9": - version "13.4.9" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.9.tgz#1798c2341bb841e96521433eed00892fb24abbd1" - integrity sha512-JhKoX5ECzYoTVyIy/7KykeO4Z2lVKq7HGQqvAH+Ip9UFn1MOJkOnkPRB7v4nmzqAoY+Je05Aj5wNABR1N18DMg== - -"@next/swc-linux-arm64-musl@13.4.9": - version "13.4.9" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.9.tgz#cee04c51610eddd3638ce2499205083656531ea0" - integrity sha512-OOn6zZBIVkm/4j5gkPdGn4yqQt+gmXaLaSjRSO434WplV8vo2YaBNbSHaTM9wJpZTHVDYyjzuIYVEzy9/5RVZw== - -"@next/swc-linux-x64-gnu@13.4.9": - version "13.4.9" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.9.tgz#1932d0367916adbc6844b244cda1d4182bd11f7a" - integrity sha512-iA+fJXFPpW0SwGmx/pivVU+2t4zQHNOOAr5T378PfxPHY6JtjV6/0s1vlAJUdIHeVpX98CLp9k5VuKgxiRHUpg== - -"@next/swc-linux-x64-musl@13.4.9": - version "13.4.9" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.9.tgz#a66aa8c1383b16299b72482f6360facd5cde3c7a" - integrity sha512-rlNf2WUtMM+GAQrZ9gMNdSapkVi3koSW3a+dmBVp42lfugWVvnyzca/xJlN48/7AGx8qu62WyO0ya1ikgOxh6A== - -"@next/swc-win32-arm64-msvc@13.4.9": - version "13.4.9" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.9.tgz#39482ee856c867177a612a30b6861c75e0736a4a" - integrity sha512-5T9ybSugXP77nw03vlgKZxD99AFTHaX8eT1ayKYYnGO9nmYhJjRPxcjU5FyYI+TdkQgEpIcH7p/guPLPR0EbKA== - -"@next/swc-win32-ia32-msvc@13.4.9": - version "13.4.9" - resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.9.tgz#29db85e34b597ade1a918235d16a760a9213c190" - integrity sha512-ojZTCt1lP2ucgpoiFgrFj07uq4CZsq4crVXpLGgQfoFq00jPKRPgesuGPaz8lg1yLfvafkU3Jd1i8snKwYR3LA== - -"@next/swc-win32-x64-msvc@13.4.9": - version "13.4.9" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.9.tgz#0c2758164cccd61bc5a1c6cd8284fe66173e4a2b" - integrity sha512-QbT03FXRNdpuL+e9pLnu+XajZdm/TtIXVYY4lA9t+9l0fLZbHXDYEKitAqxrOj37o3Vx5ufxiRAniaIebYDCgw== - "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" @@ -102,7 +62,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -182,7 +142,7 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.21.5: +browserslist@^4.21.5, "browserslist@>= 4.21.0": version "4.21.9" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz" integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== @@ -234,7 +194,7 @@ chokidar@^3.5.3, "chokidar@>=3.0.0 <4.0.0": classnames@^2.2.3: version "2.3.2" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" + resolved "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz" integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== client-only@0.0.1: @@ -339,7 +299,7 @@ get-browser-rtc@^1.1.0: resolved "https://registry.npmjs.org/get-browser-rtc/-/get-browser-rtc-1.1.0.tgz" integrity sha512-MghbMJ61EJrRsDe7w1Bvqt3ZsBuqhce5nrn/XAwgwOXhcsz53/ltdxOse1h/8eKXj5slzxdsz56g5rzOFSGwfQ== -glob-parent@^5.1.2, glob-parent@~5.1.2: +glob-parent@^5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -353,6 +313,13 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + glob-to-regexp@^0.4.1: version "0.4.1" resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" @@ -400,7 +367,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.3: +inherits@^2.0.3, inherits@2: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -632,6 +599,15 @@ postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== +postcss@^8.0.0, postcss@^8.1.0, postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.23, postcss@>=8.0.9, postcss@8.4.25: + version "8.4.25" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.25.tgz" + integrity sha512-7taJ/8t2av0Z+sQEvNzCkpDynl0tX3uJMCODi6nT3PfASC7dYCWV9aQ+uiCf+KBD4SEFcu+GvJdGdwzQ6OSjCw== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + postcss@8.4.14: version "8.4.14" resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz" @@ -641,15 +617,6 @@ postcss@8.4.14: picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@8.4.25, postcss@^8.4.23: - version "8.4.25" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.25.tgz" - integrity sha512-7taJ/8t2av0Z+sQEvNzCkpDynl0tX3uJMCODi6nT3PfASC7dYCWV9aQ+uiCf+KBD4SEFcu+GvJdGdwzQ6OSjCw== - dependencies: - nanoid "^3.3.6" - picocolors "^1.0.0" - source-map-js "^1.0.2" - prettier@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz" @@ -667,7 +634,7 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" -react-dom@^18.2.0: +"react-dom@^0.14.7 || ^15.0.0-0 || ^16.0.0 || ^17.0.0|| ^18.0.0", react-dom@^18.2.0: version "18.2.0" resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz" integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== @@ -677,12 +644,12 @@ react-dom@^18.2.0: react-dropdown@^1.11.0: version "1.11.0" - resolved "https://registry.yarnpkg.com/react-dropdown/-/react-dropdown-1.11.0.tgz#b9576de17efd28e5684d101b3f58dfe784af242c" + resolved "https://registry.npmjs.org/react-dropdown/-/react-dropdown-1.11.0.tgz" integrity sha512-E2UWetRPxNdIhQahXw6b984ME7WmcgDj9AEAjrtS/oyLCFVo+2qkCfcS06C22JR0Zj+YLnygwv0Ozf6VKKDq7g== dependencies: classnames "^2.2.3" -react@^18.2.0: +"react@^0.14.7 || ^15.0.0-0 || ^16.0.0 || ^17.0.0 || ^18.0.0", react@^18.2.0, "react@>= 16.8.0 || 17.x.x || ^18.0.0-0": version "18.2.0" resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== @@ -897,7 +864,7 @@ watchpack@2.4.0: wavesurfer.js@^7.0.3: version "7.0.3" - resolved "https://registry.yarnpkg.com/wavesurfer.js/-/wavesurfer.js-7.0.3.tgz#d3e0b07056c08d43db19d4950d2de68681f48606" + resolved "https://registry.npmjs.org/wavesurfer.js/-/wavesurfer.js-7.0.3.tgz" integrity sha512-gJ3P+Bd3Q4E8qETjjg0pneaVqm2J7jegG2Cc6vqEF5YDDKQ3m8sKsvVfgVhJkacKkO9jFAGDu58Hw4zLr7xD0A== wrappy@1: From 863a04094bc013eda98142a629c41ace0dc44022 Mon Sep 17 00:00:00 2001 From: Koper Date: Fri, 21 Jul 2023 17:39:49 +0700 Subject: [PATCH 24/41] Update dashboard.js --- app/components/dashboard.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/components/dashboard.js b/app/components/dashboard.js index dd66c17e..4dd58922 100644 --- a/app/components/dashboard.js +++ b/app/components/dashboard.js @@ -16,8 +16,7 @@ export function Dashboard({ <>
-

Reflector

-

Capture The Signal, Not The Noise

+

Meeting Topics

Timestamp
From f4235147aa3d4430f896cc4d87856a228d52af09 Mon Sep 17 00:00:00 2001 From: Koper Date: Fri, 21 Jul 2023 18:08:42 +0700 Subject: [PATCH 25/41] Last touches for new audiowave integration --- app/components/CustomRecordPlugin.js | 49 +++++----- app/components/dashboard.js | 13 ++- app/components/record.js | 131 +++++++++++++++------------ app/components/webrtc.js | 2 +- app/page.js | 5 +- 5 files changed, 108 insertions(+), 92 deletions(-) diff --git a/app/components/CustomRecordPlugin.js b/app/components/CustomRecordPlugin.js index 6ec25fd4..bbe21195 100644 --- a/app/components/CustomRecordPlugin.js +++ b/app/components/CustomRecordPlugin.js @@ -1,44 +1,51 @@ // Override the startRecording method so we can pass the desired stream // Checkout: https://github.com/katspaugh/wavesurfer.js/blob/fa2bcfe/src/plugins/record.ts -import RecordPlugin from "wavesurfer.js/dist/plugins/record" +import RecordPlugin from "wavesurfer.js/dist/plugins/record"; -const MIME_TYPES = ['audio/webm', 'audio/wav', 'audio/mpeg', 'audio/mp4', 'audio/mp3'] -const findSupportedMimeType = () => MIME_TYPES.find((mimeType) => MediaRecorder.isTypeSupported(mimeType)) +const MIME_TYPES = [ + "audio/webm", + "audio/wav", + "audio/mpeg", + "audio/mp4", + "audio/mp3", +]; +const findSupportedMimeType = () => + MIME_TYPES.find((mimeType) => MediaRecorder.isTypeSupported(mimeType)); class CustomRecordPlugin extends RecordPlugin { static create(options) { - return new CustomRecordPlugin(options || {}) + return new CustomRecordPlugin(options || {}); } startRecording(stream) { - this.preventInteraction() - this.cleanUp() + this.preventInteraction(); + this.cleanUp(); - const onStop = this.render(stream) + const onStop = this.render(stream); const mediaRecorder = new MediaRecorder(stream, { mimeType: this.options.mimeType || findSupportedMimeType(), audioBitsPerSecond: this.options.audioBitsPerSecond, - }) - const recordedChunks = [] + }); + const recordedChunks = []; - mediaRecorder.addEventListener('dataavailable', (event) => { + mediaRecorder.addEventListener("dataavailable", (event) => { if (event.data.size > 0) { - recordedChunks.push(event.data) + recordedChunks.push(event.data); } - }) + }); - mediaRecorder.addEventListener('stop', () => { - onStop() - this.loadBlob(recordedChunks, mediaRecorder.mimeType) - this.emit('stopRecording') - }) + mediaRecorder.addEventListener("stop", () => { + onStop(); + this.loadBlob(recordedChunks, mediaRecorder.mimeType); + this.emit("stopRecording"); + }); - mediaRecorder.start() + mediaRecorder.start(); - this.emit('startRecording') + this.emit("startRecording"); - this.mediaRecorder = mediaRecorder + this.mediaRecorder = mediaRecorder; } } -export default CustomRecordPlugin; \ No newline at end of file +export default CustomRecordPlugin; diff --git a/app/components/dashboard.js b/app/components/dashboard.js index 4dd58922..8ed945f3 100644 --- a/app/components/dashboard.js +++ b/app/components/dashboard.js @@ -34,14 +34,14 @@ export function Dashboard({
{item.title}{" "} {">"}
-
-
+
{openIndex === index && (
{item.transcript}
@@ -53,8 +53,7 @@ export function Dashboard({
Live
Transcript
-
-
+
{transcriptionText} @@ -63,4 +62,4 @@ export function Dashboard({
); -} \ No newline at end of file +} diff --git a/app/components/record.js b/app/components/record.js index 6b1ea345..de9897cb 100644 --- a/app/components/record.js +++ b/app/components/record.js @@ -2,106 +2,117 @@ import React, { useRef, useEffect, useState } from "react"; import WaveSurfer from "wavesurfer.js"; -import Dropdown from 'react-dropdown' -import 'react-dropdown/style.css' - -import CustomRecordPlugin from './CustomRecordPlugin' +import Dropdown from "react-dropdown"; +import "react-dropdown/style.css"; +import CustomRecordPlugin from "./CustomRecordPlugin"; export default function Recorder(props) { - const waveformRef = useRef() - const [wavesurfer, setWavesurfer] = useState(null) - const [record, setRecord] = useState(null) - const [isRecording, setIsRecording] = useState(false) - const [isPlaying, setIsPlaying] = useState(false) - const [deviceId, setDeviceId] = useState(null) - const [ddOptions, setDdOptions] = useState([]) + const waveformRef = useRef(); + const [wavesurfer, setWavesurfer] = useState(null); + const [record, setRecord] = useState(null); + const [isRecording, setIsRecording] = useState(false); + const [isPlaying, setIsPlaying] = useState(false); + const [deviceId, setDeviceId] = useState(null); + const [ddOptions, setDdOptions] = useState([]); useEffect(() => { - document.getElementById('play-btn').disabled = true + document.getElementById("play-btn").disabled = true; - navigator.mediaDevices.enumerateDevices().then(devices => { + navigator.mediaDevices.enumerateDevices().then((devices) => { const audioDevices = devices - .filter(d => d.kind === 'audioinput') - .map(d => ({value: d.deviceId, label: d.label})) - - if (audioDevices.length < 1) return console.log("no audio input devices") + .filter((d) => d.kind === "audioinput") + .map((d) => ({ value: d.deviceId, label: d.label })); - setDdOptions(audioDevices) - setDeviceId(audioDevices[0].value) - }) + if (audioDevices.length < 1) return console.log("no audio input devices"); - if(waveformRef.current) { + setDdOptions(audioDevices); + setDeviceId(audioDevices[0].value); + }); + + if (waveformRef.current) { const _wavesurfer = WaveSurfer.create({ container: waveformRef.current, - waveColor: "#333", - progressColor: "#0178FF", + waveColor: "#cc3347", + progressColor: "#0178FFπ", cursorColor: "OrangeRed", hideScrollbar: true, autoCenter: true, barWidth: 2, - }) - const wsWrapper = _wavesurfer.getWrapper() - wsWrapper.style.cursor = 'pointer' - wsWrapper.style.backgroundColor = 'lightgray' - wsWrapper.style.borderRadius = '15px' + }); + const wsWrapper = _wavesurfer.getWrapper(); + wsWrapper.style.cursor = "pointer"; + wsWrapper.style.backgroundColor = "lightgray"; + wsWrapper.style.borderRadius = "15px"; - _wavesurfer.on('play', () => { - setIsPlaying(true) - }) - _wavesurfer.on('pause', () => { - setIsPlaying(false) - }) + _wavesurfer.on("play", () => { + setIsPlaying(true); + }); + _wavesurfer.on("pause", () => { + setIsPlaying(false); + }); - setRecord(_wavesurfer.registerPlugin(CustomRecordPlugin.create())) - setWavesurfer(_wavesurfer) + setRecord(_wavesurfer.registerPlugin(CustomRecordPlugin.create())); + setWavesurfer(_wavesurfer); return () => { - _wavesurfer.destroy() - setIsRecording(false) - setIsPlaying(false) - } + _wavesurfer.destroy(); + setIsRecording(false); + setIsPlaying(false); + }; } - }, []) + }, []); const handleRecClick = async () => { - if (!record) return console.log("no record") + if (!record) return console.log("no record"); - if(record?.isRecording()) { - record.stopRecording() - setIsRecording(false) - document.getElementById('play-btn').disabled = false + if (record?.isRecording()) { + record.stopRecording(); + setIsRecording(false); + document.getElementById("play-btn").disabled = false; } else { - const stream = await navigator.mediaDevices.getUserMedia({ audio: { deviceId } }) - await record.startRecording(stream) - props.setStream(stream) - setIsRecording(true) + const stream = await navigator.mediaDevices.getUserMedia({ + audio: { deviceId }, + }); + await record.startRecording(stream); + props.setStream(stream); + setIsRecording(true); } - } + }; const handlePlayClick = () => { - wavesurfer?.playPause() - } + wavesurfer?.playPause(); + }; const handleDropdownChange = (e) => { - setDeviceId(e.value) - } - + setDeviceId(e.value); + }; return (
- ) + ); } diff --git a/app/components/webrtc.js b/app/components/webrtc.js index 927b8a95..4a310905 100644 --- a/app/components/webrtc.js +++ b/app/components/webrtc.js @@ -37,7 +37,7 @@ const useWebRTC = (stream, setIsRecording) => { peer.on("connect", () => { console.log("WebRTC connected"); - setData(prevData => ({ ...prevData, peer: peer })); + setData((prevData) => ({ ...prevData, peer: peer })); }); peer.on("data", (data) => { diff --git a/app/page.js b/app/page.js index 14993f89..9d2ae165 100644 --- a/app/page.js +++ b/app/page.js @@ -18,11 +18,10 @@ const App = () => { .then(setStream) .catch((err) => console.error(err)); } else if (!recording && serverData.peer) { - serverData.peer.send(JSON.stringify({ cmd: 'STOP' })); + serverData.peer.send(JSON.stringify({ cmd: "STOP" })); } }; - const serverData = useWebRTC(stream, setIsRecording); return ( @@ -45,4 +44,4 @@ const App = () => { ); }; -export default App; \ No newline at end of file +export default App; From 802d3832d0a93080db5878744e67293a8963f60b Mon Sep 17 00:00:00 2001 From: Koper Date: Fri, 21 Jul 2023 18:20:56 +0700 Subject: [PATCH 26/41] New footer --- app/layout.js | 10 +++++++++- app/page.js | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/app/layout.js b/app/layout.js index 0e91a9e4..858afbeb 100644 --- a/app/layout.js +++ b/app/layout.js @@ -16,7 +16,15 @@ export default function RootLayout({ children }) { Test - {children} + +
+ {children} +
+
+ © 2023 Reflector, a product of Monadical +
+ + ); } diff --git a/app/page.js b/app/page.js index 9d2ae165..91a52aba 100644 --- a/app/page.js +++ b/app/page.js @@ -35,7 +35,7 @@ const App = () => { handleRecord(recording)} - transcriptionText={serverData.text ?? "(No transcription text)"} + transcriptionText={serverData.text ?? "..."} finalSummary={serverData.finalSummary} topics={serverData.topics ?? []} stream={stream} From c889de58bea351ea4efea6cb6f89e86b422dbc17 Mon Sep 17 00:00:00 2001 From: Koper Date: Fri, 21 Jul 2023 18:22:30 +0700 Subject: [PATCH 27/41] Meeting Topics -> Meeting Notes --- app/components/dashboard.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/dashboard.js b/app/components/dashboard.js index 8ed945f3..d59ef1a2 100644 --- a/app/components/dashboard.js +++ b/app/components/dashboard.js @@ -16,7 +16,7 @@ export function Dashboard({ <>
-

Meeting Topics

+

Meeting Notes

Timestamp
From 9a1a49241d1167fbf00f14550a281e17f1e77839 Mon Sep 17 00:00:00 2001 From: Koper Date: Fri, 21 Jul 2023 18:35:19 +0700 Subject: [PATCH 28/41] Prettifying topics --- app/components/dashboard.js | 26 +++++++------- package-lock.json | 69 +++++++++++++++++++++++++++++++++++++ package.json | 6 +++- yarn.lock | 51 +++++++++++++++++++++++++-- 4 files changed, 136 insertions(+), 16 deletions(-) diff --git a/app/components/dashboard.js b/app/components/dashboard.js index d59ef1a2..f5c5bb35 100644 --- a/app/components/dashboard.js +++ b/app/components/dashboard.js @@ -1,5 +1,7 @@ import { Mulberry32 } from "../utils.js"; import React, { useState, useEffect } from "react"; +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' +import { faChevronRight, faChevronDown } from '@fortawesome/free-solid-svg-icons' export function Dashboard({ isRecording, @@ -12,6 +14,8 @@ export function Dashboard({ const [openIndex, setOpenIndex] = useState(null); const [liveTranscript, setLiveTranscript] = useState(""); + topics = [{timestamp: '[00:00]', transcript: 'Abcdef', title: 'This is the title'}]; + return ( <>
@@ -27,35 +31,33 @@ export function Dashboard({ {topics.map((item, index) => (
setOpenIndex(openIndex === index ? null : index)} >
{item.timestamp}
-
- {item.title}{" "} - - {">"} - +
+ {item.title} +
{openIndex === index && ( -
{item.transcript}
+
{item.transcript}
)}
))} +
Live
Transcript
-
+
{transcriptionText}
diff --git a/package-lock.json b/package-lock.json index 0b237347..5c0b5659 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,11 @@ "version": "0.1.0", "license": "MIT", "dependencies": { + "@fortawesome/fontawesome-svg-core": "^6.4.0", + "@fortawesome/free-solid-svg-icons": "^6.4.0", + "@fortawesome/react-fontawesome": "^0.2.0", "autoprefixer": "10.4.14", + "fontawesome": "^5.6.3", "next": "^13.4.9", "postcss": "8.4.25", "react": "^18.2.0", @@ -36,6 +40,51 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@fortawesome/fontawesome-common-types": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.0.tgz", + "integrity": "sha512-HNii132xfomg5QVZw0HwXXpN22s7VBHQBv9CeOu9tfJnhsWQNd2lmTNi8CSrnw5B+5YOmzu1UoPAyxaXsJ6RgQ==", + "hasInstallScript": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/fontawesome-svg-core": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.0.tgz", + "integrity": "sha512-Bertv8xOiVELz5raB2FlXDPKt+m94MQ3JgDfsVbrqNpLU9+UE2E18GKjLKw+d3XbeYPqg1pzyQKGsrzbw+pPaw==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.4.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-solid-svg-icons": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.4.0.tgz", + "integrity": "sha512-kutPeRGWm8V5dltFP1zGjQOEAzaLZj4StdQhWVZnfGFCvAPVvHh8qk5bRrU4KXnRRRNni5tKQI9PBAdI6MP8nQ==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "6.4.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/react-fontawesome": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz", + "integrity": "sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw==", + "dependencies": { + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "@fortawesome/fontawesome-svg-core": "~1 || ~6", + "react": ">=16.3" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", @@ -622,6 +671,11 @@ "node": ">=8" } }, + "node_modules/fontawesome": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/fontawesome/-/fontawesome-5.6.3.tgz", + "integrity": "sha512-FCc+CawwsJWWprVEg9X14yI7zI+l9YVAyhzgu70qwGeDn0tLLDH/dVfqgij72g4BBGgLGfK2qnvFGAmYUkhaWg==" + }, "node_modules/fraction.js": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", @@ -1202,6 +1256,16 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -1264,6 +1328,11 @@ "react-dom": "^0.14.7 || ^15.0.0-0 || ^16.0.0 || ^17.0.0|| ^18.0.0" } }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", diff --git a/package.json b/package.json index 5bbde722..f3f899f2 100644 --- a/package.json +++ b/package.json @@ -10,13 +10,17 @@ "format": "prettier --write ." }, "dependencies": { + "@fortawesome/fontawesome-svg-core": "^6.4.0", + "@fortawesome/free-solid-svg-icons": "^6.4.0", + "@fortawesome/react-fontawesome": "^0.2.0", "autoprefixer": "10.4.14", + "fontawesome": "^5.6.3", "next": "^13.4.9", "postcss": "8.4.25", "react": "^18.2.0", "react-dom": "^18.2.0", - "sass": "^1.63.6", "react-dropdown": "^1.11.0", + "sass": "^1.63.6", "simple-peer": "^9.11.1", "supports-color": "^9.4.0", "tailwindcss": "^3.3.2", diff --git a/yarn.lock b/yarn.lock index f189842f..e68980f5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7,6 +7,32 @@ resolved "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz" integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== +"@fortawesome/fontawesome-common-types@6.4.0": + version "6.4.0" + resolved "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.0.tgz" + integrity sha512-HNii132xfomg5QVZw0HwXXpN22s7VBHQBv9CeOu9tfJnhsWQNd2lmTNi8CSrnw5B+5YOmzu1UoPAyxaXsJ6RgQ== + +"@fortawesome/fontawesome-svg-core@^6.4.0", "@fortawesome/fontawesome-svg-core@~1 || ~6": + version "6.4.0" + resolved "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.0.tgz" + integrity sha512-Bertv8xOiVELz5raB2FlXDPKt+m94MQ3JgDfsVbrqNpLU9+UE2E18GKjLKw+d3XbeYPqg1pzyQKGsrzbw+pPaw== + dependencies: + "@fortawesome/fontawesome-common-types" "6.4.0" + +"@fortawesome/free-solid-svg-icons@^6.4.0": + version "6.4.0" + resolved "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.4.0.tgz" + integrity sha512-kutPeRGWm8V5dltFP1zGjQOEAzaLZj4StdQhWVZnfGFCvAPVvHh8qk5bRrU4KXnRRRNni5tKQI9PBAdI6MP8nQ== + dependencies: + "@fortawesome/fontawesome-common-types" "6.4.0" + +"@fortawesome/react-fontawesome@^0.2.0": + version "0.2.0" + resolved "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz" + integrity sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw== + dependencies: + prop-types "^15.8.1" + "@jridgewell/gen-mapping@^0.3.2": version "0.3.3" resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz" @@ -274,6 +300,11 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +fontawesome@^5.6.3: + version "5.6.3" + resolved "https://registry.npmjs.org/fontawesome/-/fontawesome-5.6.3.tgz" + integrity sha512-FCc+CawwsJWWprVEg9X14yI7zI+l9YVAyhzgu70qwGeDn0tLLDH/dVfqgij72g4BBGgLGfK2qnvFGAmYUkhaWg== + fraction.js@^4.2.0: version "4.2.0" resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz" @@ -423,7 +454,7 @@ lines-and-columns@^1.1.6: resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== -loose-envify@^1.1.0: +loose-envify@^1.1.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -508,7 +539,7 @@ normalize-range@^0.1.2: resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== -object-assign@^4.0.1: +object-assign@^4.0.1, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== @@ -622,6 +653,15 @@ prettier@^3.0.0: resolved "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz" integrity sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g== +prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + queue-microtask@^1.2.2, queue-microtask@^1.2.3: version "1.2.3" resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" @@ -649,7 +689,12 @@ react-dropdown@^1.11.0: dependencies: classnames "^2.2.3" -"react@^0.14.7 || ^15.0.0-0 || ^16.0.0 || ^17.0.0 || ^18.0.0", react@^18.2.0, "react@>= 16.8.0 || 17.x.x || ^18.0.0-0": +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +"react@^0.14.7 || ^15.0.0-0 || ^16.0.0 || ^17.0.0 || ^18.0.0", react@^18.2.0, "react@>= 16.8.0 || 17.x.x || ^18.0.0-0", react@>=16.3: version "18.2.0" resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== From 467f8c83890c9c85c0b9754e75d2ba6c997d807d Mon Sep 17 00:00:00 2001 From: Koper Date: Fri, 21 Jul 2023 18:37:35 +0700 Subject: [PATCH 29/41] Update dashboard.js --- app/components/dashboard.js | 1 - 1 file changed, 1 deletion(-) diff --git a/app/components/dashboard.js b/app/components/dashboard.js index f5c5bb35..4104ac56 100644 --- a/app/components/dashboard.js +++ b/app/components/dashboard.js @@ -12,7 +12,6 @@ export function Dashboard({ stream, }) { const [openIndex, setOpenIndex] = useState(null); - const [liveTranscript, setLiveTranscript] = useState(""); topics = [{timestamp: '[00:00]', transcript: 'Abcdef', title: 'This is the title'}]; From 29351def4ad0c4208baee07f6f6933b5fb7487da Mon Sep 17 00:00:00 2001 From: Koper Date: Fri, 21 Jul 2023 18:39:14 +0700 Subject: [PATCH 30/41] Update dashboard.js --- app/components/dashboard.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/app/components/dashboard.js b/app/components/dashboard.js index d59ef1a2..2a2d3581 100644 --- a/app/components/dashboard.js +++ b/app/components/dashboard.js @@ -59,6 +59,14 @@ export function Dashboard({ {transcriptionText}
+ + {finalSummary && ( +
+

Final Summary

+

Duration: {finalSummary.duration}

+

{finalSummary.summary}

+
+ )}
); From 573664999ffe0af1feaf6ca7c0654ddcd105fcd6 Mon Sep 17 00:00:00 2001 From: Jose B Date: Fri, 21 Jul 2023 06:56:29 -0500 Subject: [PATCH 31/41] custom recording waveform --- app/components/CustomRecordPlugin.js | 77 ++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/app/components/CustomRecordPlugin.js b/app/components/CustomRecordPlugin.js index 6ec25fd4..c8955c58 100644 --- a/app/components/CustomRecordPlugin.js +++ b/app/components/CustomRecordPlugin.js @@ -10,6 +10,83 @@ class CustomRecordPlugin extends RecordPlugin { static create(options) { return new CustomRecordPlugin(options || {}) } + render(stream) { + if (!this.wavesurfer) return () => undefined + + const container = this.wavesurfer.getWrapper() + const canvas = document.createElement('canvas') + canvas.width = container.clientWidth + canvas.height = container.clientHeight + canvas.style.zIndex = '10' + container.appendChild(canvas) + + const canvasCtx = canvas.getContext('2d') + const audioContext = new AudioContext() + const source = audioContext.createMediaStreamSource(stream) + const analyser = audioContext.createAnalyser() + analyser.fftSize = 2 ** 5 + source.connect(analyser) + const bufferLength = analyser.frequencyBinCount + const dataArray = new Uint8Array(bufferLength) + + let animationId, previousTimeStamp; + const BUFFER_SIZE = 2 ** 8 + const dataBuffer = new Array(BUFFER_SIZE).fill(canvas.height) + + const drawWaveform = (timeStamp) => { + if (!canvasCtx) return + + analyser.getByteTimeDomainData(dataArray) + canvasCtx.clearRect(0, 0, canvas.width, canvas.height) + canvasCtx.fillStyle = 'black' + + if (previousTimeStamp === undefined) { + previousTimeStamp = timeStamp + dataBuffer.push(Math.min(...dataArray)) + dataBuffer.splice(0, 1) + } + const elapsed = timeStamp - previousTimeStamp; + if (elapsed > 10) { + previousTimeStamp = timeStamp + dataBuffer.push(Math.min(...dataArray)) + dataBuffer.splice(0, 1) + } + + // Drawing + const sliceWidth = canvas.width / dataBuffer.length + let x = 0 + + for (let i = 0; i < dataBuffer.length; i++) { + const valueNormalized = dataBuffer[i] / canvas.height + const y = valueNormalized * canvas.height / 2 + const sliceHeight = canvas.height + 1 - y * 2 + + canvasCtx.fillRect(x, y, sliceWidth * 2 / 3, sliceHeight) + x += sliceWidth + } + + animationId = requestAnimationFrame(drawWaveform) + } + + drawWaveform() + + return () => { + if (animationId) { + cancelAnimationFrame(animationId) + } + + if (source) { + source.disconnect() + source.mediaStream.getTracks().forEach((track) => track.stop()) + } + + if (audioContext) { + audioContext.close() + } + + canvas?.remove() + } + } startRecording(stream) { this.preventInteraction() this.cleanUp() From e69071e1d50131c84947e200c9dc5a97cbf7779e Mon Sep 17 00:00:00 2001 From: Koper Date: Fri, 21 Jul 2023 19:00:48 +0700 Subject: [PATCH 32/41] Essential fixes --- app/components/dashboard.js | 2 - app/components/record.js | 2 + app/components/webrtc.js | 1 + app/page.js | 2 +- yarn.lock | 95 +++++++++++++++++++++++++------------ 5 files changed, 68 insertions(+), 34 deletions(-) diff --git a/app/components/dashboard.js b/app/components/dashboard.js index ae9d1d1f..b97bfffd 100644 --- a/app/components/dashboard.js +++ b/app/components/dashboard.js @@ -13,8 +13,6 @@ export function Dashboard({ }) { const [openIndex, setOpenIndex] = useState(null); - topics = [{timestamp: '[00:00]', transcript: 'Abcdef', title: 'This is the title'}]; - return ( <>
diff --git a/app/components/record.js b/app/components/record.js index de9897cb..70336e5d 100644 --- a/app/components/record.js +++ b/app/components/record.js @@ -66,6 +66,8 @@ export default function Recorder(props) { if (!record) return console.log("no record"); if (record?.isRecording()) { + + props.serverData.peer.send(JSON.stringify({ cmd: "STOP" })); record.stopRecording(); setIsRecording(false); document.getElementById("play-btn").disabled = false; diff --git a/app/components/webrtc.js b/app/components/webrtc.js index 4a310905..41759e69 100644 --- a/app/components/webrtc.js +++ b/app/components/webrtc.js @@ -64,6 +64,7 @@ const useWebRTC = (stream, setIsRecording) => { duration: serverData.duration, summary: serverData.summary, }, + text: '' })); setIsRecording(false); break; diff --git a/app/page.js b/app/page.js index 91a52aba..1bea5b81 100644 --- a/app/page.js +++ b/app/page.js @@ -31,7 +31,7 @@ const App = () => {

Capture The Signal, Not The Noise

- + handleRecord(recording)} diff --git a/yarn.lock b/yarn.lock index e68980f5..a1e1ab1e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12,7 +12,7 @@ resolved "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.0.tgz" integrity sha512-HNii132xfomg5QVZw0HwXXpN22s7VBHQBv9CeOu9tfJnhsWQNd2lmTNi8CSrnw5B+5YOmzu1UoPAyxaXsJ6RgQ== -"@fortawesome/fontawesome-svg-core@^6.4.0", "@fortawesome/fontawesome-svg-core@~1 || ~6": +"@fortawesome/fontawesome-svg-core@^6.4.0": version "6.4.0" resolved "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.0.tgz" integrity sha512-Bertv8xOiVELz5raB2FlXDPKt+m94MQ3JgDfsVbrqNpLU9+UE2E18GKjLKw+d3XbeYPqg1pzyQKGsrzbw+pPaw== @@ -52,16 +52,16 @@ resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.15" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - "@jridgewell/sourcemap-codec@1.4.14": version "1.4.14" resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.15" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + "@jridgewell/trace-mapping@^0.3.9": version "0.3.18" resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz" @@ -80,6 +80,46 @@ resolved "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.4.9.tgz" integrity sha512-TVzGHpZoVBk3iDsTOQA/R6MGmFp0+17SWXMEWd6zG30AfuELmSSMe2SdPqxwXU0gbpWkJL1KgfLzy5ReN0crqQ== +"@next/swc-darwin-x64@13.4.9": + version "13.4.9" + resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-13.4.9.tgz#a08fccdee68201522fe6618ec81f832084b222f8" + integrity sha512-aSfF1fhv28N2e7vrDZ6zOQ+IIthocfaxuMWGReB5GDriF0caTqtHttAvzOMgJgXQtQx6XhyaJMozLTSEXeNN+A== + +"@next/swc-linux-arm64-gnu@13.4.9": + version "13.4.9" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.4.9.tgz#1798c2341bb841e96521433eed00892fb24abbd1" + integrity sha512-JhKoX5ECzYoTVyIy/7KykeO4Z2lVKq7HGQqvAH+Ip9UFn1MOJkOnkPRB7v4nmzqAoY+Je05Aj5wNABR1N18DMg== + +"@next/swc-linux-arm64-musl@13.4.9": + version "13.4.9" + resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.4.9.tgz#cee04c51610eddd3638ce2499205083656531ea0" + integrity sha512-OOn6zZBIVkm/4j5gkPdGn4yqQt+gmXaLaSjRSO434WplV8vo2YaBNbSHaTM9wJpZTHVDYyjzuIYVEzy9/5RVZw== + +"@next/swc-linux-x64-gnu@13.4.9": + version "13.4.9" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.4.9.tgz#1932d0367916adbc6844b244cda1d4182bd11f7a" + integrity sha512-iA+fJXFPpW0SwGmx/pivVU+2t4zQHNOOAr5T378PfxPHY6JtjV6/0s1vlAJUdIHeVpX98CLp9k5VuKgxiRHUpg== + +"@next/swc-linux-x64-musl@13.4.9": + version "13.4.9" + resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.4.9.tgz#a66aa8c1383b16299b72482f6360facd5cde3c7a" + integrity sha512-rlNf2WUtMM+GAQrZ9gMNdSapkVi3koSW3a+dmBVp42lfugWVvnyzca/xJlN48/7AGx8qu62WyO0ya1ikgOxh6A== + +"@next/swc-win32-arm64-msvc@13.4.9": + version "13.4.9" + resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.4.9.tgz#39482ee856c867177a612a30b6861c75e0736a4a" + integrity sha512-5T9ybSugXP77nw03vlgKZxD99AFTHaX8eT1ayKYYnGO9nmYhJjRPxcjU5FyYI+TdkQgEpIcH7p/guPLPR0EbKA== + +"@next/swc-win32-ia32-msvc@13.4.9": + version "13.4.9" + resolved "https://registry.yarnpkg.com/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.4.9.tgz#29db85e34b597ade1a918235d16a760a9213c190" + integrity sha512-ojZTCt1lP2ucgpoiFgrFj07uq4CZsq4crVXpLGgQfoFq00jPKRPgesuGPaz8lg1yLfvafkU3Jd1i8snKwYR3LA== + +"@next/swc-win32-x64-msvc@13.4.9": + version "13.4.9" + resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.4.9.tgz#0c2758164cccd61bc5a1c6cd8284fe66173e4a2b" + integrity sha512-QbT03FXRNdpuL+e9pLnu+XajZdm/TtIXVYY4lA9t+9l0fLZbHXDYEKitAqxrOj37o3Vx5ufxiRAniaIebYDCgw== + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" @@ -88,7 +128,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -168,7 +208,7 @@ braces@^3.0.2, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.21.5, "browserslist@>= 4.21.0": +browserslist@^4.21.5: version "4.21.9" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz" integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== @@ -203,7 +243,7 @@ caniuse-lite@^1.0.30001406, caniuse-lite@^1.0.30001464, caniuse-lite@^1.0.300015 resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001515.tgz" integrity sha512-eEFDwUOZbE24sb+Ecsx3+OvNETqjWIdabMy52oOkIgcUtAsQifjUG9q4U9dgTHJM2mfk4uEPxc0+xuFdJ629QA== -chokidar@^3.5.3, "chokidar@>=3.0.0 <4.0.0": +"chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.3: version "3.5.3" resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== @@ -330,7 +370,7 @@ get-browser-rtc@^1.1.0: resolved "https://registry.npmjs.org/get-browser-rtc/-/get-browser-rtc-1.1.0.tgz" integrity sha512-MghbMJ61EJrRsDe7w1Bvqt3ZsBuqhce5nrn/XAwgwOXhcsz53/ltdxOse1h/8eKXj5slzxdsz56g5rzOFSGwfQ== -glob-parent@^5.1.2: +glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -344,13 +384,6 @@ glob-parent@^6.0.2: dependencies: is-glob "^4.0.3" -glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - glob-to-regexp@^0.4.1: version "0.4.1" resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" @@ -398,7 +431,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@^2.0.3, inherits@2: +inherits@2, inherits@^2.0.3: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -630,15 +663,6 @@ postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.0.0, postcss@^8.1.0, postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.23, postcss@>=8.0.9, postcss@8.4.25: - version "8.4.25" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.25.tgz" - integrity sha512-7taJ/8t2av0Z+sQEvNzCkpDynl0tX3uJMCODi6nT3PfASC7dYCWV9aQ+uiCf+KBD4SEFcu+GvJdGdwzQ6OSjCw== - dependencies: - nanoid "^3.3.6" - picocolors "^1.0.0" - source-map-js "^1.0.2" - postcss@8.4.14: version "8.4.14" resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz" @@ -648,6 +672,15 @@ postcss@8.4.14: picocolors "^1.0.0" source-map-js "^1.0.2" +postcss@8.4.25, postcss@^8.4.23: + version "8.4.25" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.25.tgz" + integrity sha512-7taJ/8t2av0Z+sQEvNzCkpDynl0tX3uJMCODi6nT3PfASC7dYCWV9aQ+uiCf+KBD4SEFcu+GvJdGdwzQ6OSjCw== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + prettier@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/prettier/-/prettier-3.0.0.tgz" @@ -674,7 +707,7 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" -"react-dom@^0.14.7 || ^15.0.0-0 || ^16.0.0 || ^17.0.0|| ^18.0.0", react-dom@^18.2.0: +react-dom@^18.2.0: version "18.2.0" resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz" integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== @@ -694,7 +727,7 @@ react-is@^16.13.1: resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -"react@^0.14.7 || ^15.0.0-0 || ^16.0.0 || ^17.0.0 || ^18.0.0", react@^18.2.0, "react@>= 16.8.0 || 17.x.x || ^18.0.0-0", react@>=16.3: +react@^18.2.0: version "18.2.0" resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== @@ -750,7 +783,7 @@ safe-buffer@^5.1.0, safe-buffer@~5.2.0: resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -sass@^1.3.0, sass@^1.63.6: +sass@^1.63.6: version "1.63.6" resolved "https://registry.npmjs.org/sass/-/sass-1.63.6.tgz" integrity sha512-MJuxGMHzaOW7ipp+1KdELtqKbfAWbH7OLIdoSMnVe3EXPMTmxTmlaZDCTsgIpPCs3w99lLo9/zDKkOrJuT5byw== @@ -779,7 +812,7 @@ simple-peer@^9.11.1: randombytes "^2.1.0" readable-stream "^3.6.0" -source-map-js@^1.0.2, "source-map-js@>=0.6.2 <2.0.0": +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== From e6578d1da2d1ce98ce2fa8ddd0973275a5e2613d Mon Sep 17 00:00:00 2001 From: Jose B Date: Fri, 21 Jul 2023 07:13:21 -0500 Subject: [PATCH 33/41] minor fix --- app/components/record.js | 1 + app/globals.scss | 9 +-------- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/app/components/record.js b/app/components/record.js index de9897cb..6079a920 100644 --- a/app/components/record.js +++ b/app/components/record.js @@ -69,6 +69,7 @@ export default function Recorder(props) { record.stopRecording(); setIsRecording(false); document.getElementById("play-btn").disabled = false; + props.onStop() } else { const stream = await navigator.mediaDevices.getUserMedia({ audio: { deviceId }, diff --git a/app/globals.scss b/app/globals.scss index a1c78d64..acc5dae4 100644 --- a/app/globals.scss +++ b/app/globals.scss @@ -8,14 +8,6 @@ --background-end-rgb: 255, 255, 255; } -@media (prefers-color-scheme: dark) { - :root { - --foreground-rgb: 255, 255, 255; - --background-start-rgb: 32, 32, 32; - --background-end-rgb: 32, 32, 32; - } -} - body { background: linear-gradient( to bottom, @@ -25,6 +17,7 @@ body { rgb(var(--background-start-rgb)); font-family: "Roboto", sans-serif; + color: var(--foreground-rgb); } .temp-transcription { From b99c8430e45d6463e5314f8d049e75bca2ea8512 Mon Sep 17 00:00:00 2001 From: Koper Date: Fri, 21 Jul 2023 19:17:03 +0700 Subject: [PATCH 34/41] Transcript in footer --- app/components/dashboard.js | 17 +++++------------ app/layout.js | 3 --- 2 files changed, 5 insertions(+), 15 deletions(-) diff --git a/app/components/dashboard.js b/app/components/dashboard.js index b97bfffd..28467503 100644 --- a/app/components/dashboard.js +++ b/app/components/dashboard.js @@ -48,25 +48,18 @@ export function Dashboard({ ))} -
-
-
Live
-
Transcript
-
-
-
- {transcriptionText} -
-
- {finalSummary && ( -
+

Final Summary

Duration: {finalSummary.duration}

{finalSummary.summary}

)}
+ +
+ {transcriptionText} +
); } diff --git a/app/layout.js b/app/layout.js index 858afbeb..2e0bf202 100644 --- a/app/layout.js +++ b/app/layout.js @@ -20,9 +20,6 @@ export default function RootLayout({ children }) {
{children}
-
- © 2023 Reflector, a product of Monadical -
From 0db646e0fddebf7c08a27f2dca254aaad8e64522 Mon Sep 17 00:00:00 2001 From: Koper Date: Fri, 21 Jul 2023 19:19:52 +0700 Subject: [PATCH 35/41] Made transcription text bigger --- app/components/dashboard.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/dashboard.js b/app/components/dashboard.js index 28467503..ac643aea 100644 --- a/app/components/dashboard.js +++ b/app/components/dashboard.js @@ -57,7 +57,7 @@ export function Dashboard({ )}
-