From 76a38d63040e84ca08fe4639eda33c4b64d1145b Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Mon, 18 Dec 2023 07:37:49 +1100 Subject: [PATCH 01/46] add vite + crxjs (buggy) --- public/manifest.json => manifest.json | 12 +- package.json | 10 +- pnpm-lock.yaml | 392 +++++++ public/purify.min.js | 1389 ------------------------- src/SEQTA.ts | 49 +- src/background.ts | 2 +- src/css/iframe.scss | 1 - vite.config.js | 14 + webpack.config.js | 87 -- 9 files changed, 442 insertions(+), 1514 deletions(-) rename public/manifest.json => manifest.json (85%) delete mode 100644 public/purify.min.js create mode 100644 vite.config.js delete mode 100644 webpack.config.js diff --git a/public/manifest.json b/manifest.json similarity index 85% rename from public/manifest.json rename to manifest.json index 3b33a730..b44fb74b 100644 --- a/public/manifest.json +++ b/manifest.json @@ -20,12 +20,12 @@ "permissions": ["tabs", "notifications", "storage"], "host_permissions": ["https://newsapi.org/", "*://*/*"], "background": { - "service_worker": "background.js" + "service_worker": "src/background.ts" }, "content_scripts": [ { "matches": ["*://*/*"], - "js": ["browser-polyfill.js", "purify.min.js", "SEQTA.js"], + "js": ["src/SEQTA.ts"], "run_at": "document_start" } ], @@ -50,14 +50,6 @@ "resources": ["popup/*"], "matches": ["*://*/*"] }, - { - "resources": ["client.js"], - "matches": ["*://*/*"] - }, - { - "resources": ["index.css"], - "matches": ["*://*/*"] - }, { "resources": ["interface/*"], "matches": ["*://*/*"] diff --git a/package.json b/package.json index 2b611fc0..8e0a3a39 100644 --- a/package.json +++ b/package.json @@ -5,17 +5,20 @@ "description": "BetterSEQTA+ is a browser extension that adds features to SEQTA.", "main": "webpack.config.js", "scripts": { - "build": "webpack --config webpack.config.js --mode production && sh ./package.sh", - "dev": "webpack --config webpack.config.js --watch --mode development", + "build": "vite build", + "dev": "vite dev", + "build-old": "webpack --config webpack.config.js --mode production && sh ./package.sh", + "dev-old": "webpack --config webpack.config.js --watch --mode development", "eslint": "eslint --fix ." }, "keywords": [], "author": "", "license": "MIT", "devDependencies": { + "@crxjs/vite-plugin": "latest", "copy-webpack-plugin": "^11.0.0", "css-loader": "^6.8.1", - "dompurify": "^3.0.5", + "dompurify": "^3.0.6", "eslint": "^8.48.0", "eslint-config-prettier": "^9.0.0", "eslint-webpack-plugin": "^4.0.1", @@ -25,6 +28,7 @@ "sass": "^1.69.5", "sass-loader": "^13.3.2", "style-loader": "^3.3.3", + "vite": "^5.0.10", "webextension-polyfill": "^0.10.0", "webpack": "^5.88.2", "webpack-cli": "^5.1.4" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fc1bba91..110f1987 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -100,6 +100,9 @@ devDependencies: style-loader: specifier: ^3.3.3 version: 3.3.3(webpack@5.89.0) + vite: + specifier: ^5.0.10 + version: 5.0.10(sass@1.69.5) webextension-polyfill: specifier: ^0.10.0 version: 0.10.0 @@ -126,6 +129,204 @@ packages: resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} engines: {node: '>=10.0.0'} + /@esbuild/android-arm64@0.19.9: + resolution: {integrity: sha512-q4cR+6ZD0938R19MyEW3jEsMzbb/1rulLXiNAJQADD/XYp7pT+rOS5JGxvpRW8dFDEfjW4wLgC/3FXIw4zYglQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-arm@0.19.9: + resolution: {integrity: sha512-jkYjjq7SdsWuNI6b5quymW0oC83NN5FdRPuCbs9HZ02mfVdAP8B8eeqLSYU3gb6OJEaY5CQabtTFbqBf26H3GA==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/android-x64@0.19.9: + resolution: {integrity: sha512-KOqoPntWAH6ZxDwx1D6mRntIgZh9KodzgNOy5Ebt9ghzffOk9X2c1sPwtM9P+0eXbefnDhqYfkh5PLP5ULtWFA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-arm64@0.19.9: + resolution: {integrity: sha512-KBJ9S0AFyLVx2E5D8W0vExqRW01WqRtczUZ8NRu+Pi+87opZn5tL4Y0xT0mA4FtHctd0ZgwNoN639fUUGlNIWw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/darwin-x64@0.19.9: + resolution: {integrity: sha512-vE0VotmNTQaTdX0Q9dOHmMTao6ObjyPm58CHZr1UK7qpNleQyxlFlNCaHsHx6Uqv86VgPmR4o2wdNq3dP1qyDQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-arm64@0.19.9: + resolution: {integrity: sha512-uFQyd/o1IjiEk3rUHSwUKkqZwqdvuD8GevWF065eqgYfexcVkxh+IJgwTaGZVu59XczZGcN/YMh9uF1fWD8j1g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/freebsd-x64@0.19.9: + resolution: {integrity: sha512-WMLgWAtkdTbTu1AWacY7uoj/YtHthgqrqhf1OaEWnZb7PQgpt8eaA/F3LkV0E6K/Lc0cUr/uaVP/49iE4M4asA==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm64@0.19.9: + resolution: {integrity: sha512-PiPblfe1BjK7WDAKR1Cr9O7VVPqVNpwFcPWgfn4xu0eMemzRp442hXyzF/fSwgrufI66FpHOEJk0yYdPInsmyQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-arm@0.19.9: + resolution: {integrity: sha512-C/ChPohUYoyUaqn1h17m/6yt6OB14hbXvT8EgM1ZWaiiTYz7nWZR0SYmMnB5BzQA4GXl3BgBO1l8MYqL/He3qw==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ia32@0.19.9: + resolution: {integrity: sha512-f37i/0zE0MjDxijkPSQw1CO/7C27Eojqb+r3BbHVxMLkj8GCa78TrBZzvPyA/FNLUMzP3eyHCVkAopkKVja+6Q==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-loong64@0.19.9: + resolution: {integrity: sha512-t6mN147pUIf3t6wUt3FeumoOTPfmv9Cc6DQlsVBpB7eCpLOqQDyWBP1ymXn1lDw4fNUSb/gBcKAmvTP49oIkaA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-mips64el@0.19.9: + resolution: {integrity: sha512-jg9fujJTNTQBuDXdmAg1eeJUL4Jds7BklOTkkH80ZgQIoCTdQrDaHYgbFZyeTq8zbY+axgptncko3v9p5hLZtw==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-ppc64@0.19.9: + resolution: {integrity: sha512-tkV0xUX0pUUgY4ha7z5BbDS85uI7ABw3V1d0RNTii7E9lbmV8Z37Pup2tsLV46SQWzjOeyDi1Q7Wx2+QM8WaCQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-riscv64@0.19.9: + resolution: {integrity: sha512-DfLp8dj91cufgPZDXr9p3FoR++m3ZJ6uIXsXrIvJdOjXVREtXuQCjfMfvmc3LScAVmLjcfloyVtpn43D56JFHg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-s390x@0.19.9: + resolution: {integrity: sha512-zHbglfEdC88KMgCWpOl/zc6dDYJvWGLiUtmPRsr1OgCViu3z5GncvNVdf+6/56O2Ca8jUU+t1BW261V6kp8qdw==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/linux-x64@0.19.9: + resolution: {integrity: sha512-JUjpystGFFmNrEHQnIVG8hKwvA2DN5o7RqiO1CVX8EN/F/gkCjkUMgVn6hzScpwnJtl2mPR6I9XV1oW8k9O+0A==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@esbuild/netbsd-x64@0.19.9: + resolution: {integrity: sha512-GThgZPAwOBOsheA2RUlW5UeroRfESwMq/guy8uEe3wJlAOjpOXuSevLRd70NZ37ZrpO6RHGHgEHvPg1h3S1Jug==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/openbsd-x64@0.19.9: + resolution: {integrity: sha512-Ki6PlzppaFVbLnD8PtlVQfsYw4S9n3eQl87cqgeIw+O3sRr9IghpfSKY62mggdt1yCSZ8QWvTZ9jo9fjDSg9uw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: true + optional: true + + /@esbuild/sunos-x64@0.19.9: + resolution: {integrity: sha512-MLHj7k9hWh4y1ddkBpvRj2b9NCBhfgBt3VpWbHQnXRedVun/hC7sIyTGDGTfsGuXo4ebik2+3ShjcPbhtFwWDw==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-arm64@0.19.9: + resolution: {integrity: sha512-GQoa6OrQ8G08guMFgeXPH7yE/8Dt0IfOGWJSfSH4uafwdC7rWwrfE6P9N8AtPGIjUzdo2+7bN8Xo3qC578olhg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-ia32@0.19.9: + resolution: {integrity: sha512-UOozV7Ntykvr5tSOlGCrqU3NBr3d8JqPes0QWN2WOXfvkWVGRajC+Ym0/Wj88fUgecUCLDdJPDF0Nna2UK3Qtg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@esbuild/win32-x64@0.19.9: + resolution: {integrity: sha512-oxoQgglOP7RH6iasDrhY+R/3cHrfwIDvRlT4CGChflq6twk8iENeVvMJjmvBb94Ik1Z+93iGO27err7w6l54GQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@eslint-community/eslint-utils@4.4.0(eslint@8.55.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -312,6 +513,110 @@ packages: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 + /@rollup/rollup-android-arm-eabi@4.9.1: + resolution: {integrity: sha512-6vMdBZqtq1dVQ4CWdhFwhKZL6E4L1dV6jUjuBvsavvNJSppzi6dLBbuV+3+IyUREaj9ZFvQefnQm28v4OCXlig==} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-android-arm64@4.9.1: + resolution: {integrity: sha512-Jto9Fl3YQ9OLsTDWtLFPtaIMSL2kwGyGoVCmPC8Gxvym9TCZm4Sie+cVeblPO66YZsYH8MhBKDMGZ2NDxuk/XQ==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-arm64@4.9.1: + resolution: {integrity: sha512-LtYcLNM+bhsaKAIGwVkh5IOWhaZhjTfNOkGzGqdHvhiCUVuJDalvDxEdSnhFzAn+g23wgsycmZk1vbnaibZwwA==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-x64@4.9.1: + resolution: {integrity: sha512-KyP/byeXu9V+etKO6Lw3E4tW4QdcnzDG/ake031mg42lob5tN+5qfr+lkcT/SGZaH2PdW4Z1NX9GHEkZ8xV7og==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.9.1: + resolution: {integrity: sha512-Yqz/Doumf3QTKplwGNrCHe/B2p9xqDghBZSlAY0/hU6ikuDVQuOUIpDP/YcmoT+447tsZTmirmjgG3znvSCR0Q==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.9.1: + resolution: {integrity: sha512-u3XkZVvxcvlAOlQJ3UsD1rFvLWqu4Ef/Ggl40WAVCuogf4S1nJPHh5RTgqYFpCOvuGJ7H5yGHabjFKEZGExk5Q==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-musl@4.9.1: + resolution: {integrity: sha512-0XSYN/rfWShW+i+qjZ0phc6vZ7UWI8XWNz4E/l+6edFt+FxoEghrJHjX1EY/kcUGCnZzYYRCl31SNdfOi450Aw==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.9.1: + resolution: {integrity: sha512-LmYIO65oZVfFt9t6cpYkbC4d5lKHLYv5B4CSHRpnANq0VZUQXGcCPXHzbCXCz4RQnx7jvlYB1ISVNCE/omz5cw==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.9.1: + resolution: {integrity: sha512-kr8rEPQ6ns/Lmr/hiw8sEVj9aa07gh1/tQF2Y5HrNCCEPiCBGnBUt9tVusrcBBiJfIt1yNaXN6r1CCmpbFEDpg==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-musl@4.9.1: + resolution: {integrity: sha512-t4QSR7gN+OEZLG0MiCgPqMWZGwmeHhsM4AkegJ0Kiy6TnJ9vZ8dEIwHw1LcZKhbHxTY32hp9eVCMdR3/I8MGRw==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.9.1: + resolution: {integrity: sha512-7XI4ZCBN34cb+BH557FJPmh0kmNz2c25SCQeT9OiFWEgf8+dL6ZwJ8f9RnUIit+j01u07Yvrsuu1rZGxJCc51g==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-ia32-msvc@4.9.1: + resolution: {integrity: sha512-yE5c2j1lSWOH5jp+Q0qNL3Mdhr8WuqCNVjc6BxbVfS5cAS6zRmdiw7ktb8GNpDCEUJphILY6KACoFoRtKoqNQg==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-x64-msvc@4.9.1: + resolution: {integrity: sha512-PyJsSsafjmIhVgaI1Zdj7m8BB8mMckFah/xbpplObyHfiXzKcI5UOUXRyOdHW7nz4DpMCuzLnF7v5IWHenCwYA==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + /@sentry-internal/feedback@7.85.0: resolution: {integrity: sha512-MlbIN+N8CWFJBjbqMmARe4+UPo9QRhRar0YoOfmNA2Xqk/EwXcjHWkealosHznXH7tqVbjB25QJpHtDystft/Q==} engines: {node: '>=12'} @@ -1112,6 +1417,36 @@ packages: /es-module-lexer@1.4.1: resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} + /esbuild@0.19.9: + resolution: {integrity: sha512-U9CHtKSy+EpPsEBa+/A2gMs/h3ylBC0H0KSqIg7tpztHerLi6nrrcoUJAkNCEPumx8yJ+Byic4BVwHgRbN0TBg==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/android-arm': 0.19.9 + '@esbuild/android-arm64': 0.19.9 + '@esbuild/android-x64': 0.19.9 + '@esbuild/darwin-arm64': 0.19.9 + '@esbuild/darwin-x64': 0.19.9 + '@esbuild/freebsd-arm64': 0.19.9 + '@esbuild/freebsd-x64': 0.19.9 + '@esbuild/linux-arm': 0.19.9 + '@esbuild/linux-arm64': 0.19.9 + '@esbuild/linux-ia32': 0.19.9 + '@esbuild/linux-loong64': 0.19.9 + '@esbuild/linux-mips64el': 0.19.9 + '@esbuild/linux-ppc64': 0.19.9 + '@esbuild/linux-riscv64': 0.19.9 + '@esbuild/linux-s390x': 0.19.9 + '@esbuild/linux-x64': 0.19.9 + '@esbuild/netbsd-x64': 0.19.9 + '@esbuild/openbsd-x64': 0.19.9 + '@esbuild/sunos-x64': 0.19.9 + '@esbuild/win32-arm64': 0.19.9 + '@esbuild/win32-ia32': 0.19.9 + '@esbuild/win32-x64': 0.19.9 + dev: true + /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} @@ -2234,6 +2569,27 @@ packages: glob: 7.2.3 dev: true + /rollup@4.9.1: + resolution: {integrity: sha512-pgPO9DWzLoW/vIhlSoDByCzcpX92bKEorbgXuZrqxByte3JFk2xSW2JEeAcyLc9Ru9pqcNNW+Ob7ntsk2oT/Xw==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.9.1 + '@rollup/rollup-android-arm64': 4.9.1 + '@rollup/rollup-darwin-arm64': 4.9.1 + '@rollup/rollup-darwin-x64': 4.9.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.9.1 + '@rollup/rollup-linux-arm64-gnu': 4.9.1 + '@rollup/rollup-linux-arm64-musl': 4.9.1 + '@rollup/rollup-linux-riscv64-gnu': 4.9.1 + '@rollup/rollup-linux-x64-gnu': 4.9.1 + '@rollup/rollup-linux-x64-musl': 4.9.1 + '@rollup/rollup-win32-arm64-msvc': 4.9.1 + '@rollup/rollup-win32-ia32-msvc': 4.9.1 + '@rollup/rollup-win32-x64-msvc': 4.9.1 + fsevents: 2.3.3 + dev: true + /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: @@ -2579,6 +2935,42 @@ packages: hasBin: true dev: false + /vite@5.0.10(sass@1.69.5): + resolution: {integrity: sha512-2P8J7WWgmc355HUMlFrwofacvr98DAjoE52BfdbwQtyLH06XKwaL/FMnmKM2crF0iX4MpmMKoDlNCB1ok7zHCw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.19.9 + postcss: 8.4.32 + rollup: 4.9.1 + sass: 1.69.5 + optionalDependencies: + fsevents: 2.3.3 + dev: true + /watchpack@2.4.0: resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} engines: {node: '>=10.13.0'} diff --git a/public/purify.min.js b/public/purify.min.js deleted file mode 100644 index 32954ef5..00000000 --- a/public/purify.min.js +++ /dev/null @@ -1,1389 +0,0 @@ -/*! @license DOMPurify 3.0.3 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.0.3/LICENSE */ -!(function (e, t) { - 'object' == typeof exports && 'undefined' != typeof module - ? (module.exports = t()) - : 'function' == typeof define && define.amd - ? define(t) - : ((e = - 'undefined' != typeof globalThis ? globalThis : e || self).DOMPurify = - t()); -})(this, function () { - 'use strict'; - const { - entries: e, - setPrototypeOf: t, - isFrozen: n, - getPrototypeOf: o, - getOwnPropertyDescriptor: r, - } = Object; - let { freeze: i, seal: a, create: l } = Object, - { apply: c, construct: s } = 'undefined' != typeof Reflect && Reflect; - c || - (c = function (e, t, n) { - return e.apply(t, n); - }), - i || - (i = function (e) { - return e; - }), - a || - (a = function (e) { - return e; - }), - s || - (s = function (e, t) { - return new e(...t); - }); - const m = b(Array.prototype.forEach), - u = b(Array.prototype.pop), - f = b(Array.prototype.push), - p = b(String.prototype.toLowerCase), - d = b(String.prototype.toString), - h = b(String.prototype.match), - g = b(String.prototype.replace), - T = b(String.prototype.indexOf), - y = b(String.prototype.trim), - E = b(RegExp.prototype.test), - A = - ((_ = TypeError), - function () { - for (var e = arguments.length, t = new Array(e), n = 0; n < e; n++) - t[n] = arguments[n]; - return s(_, t); - }); - var _; - function b(e) { - return function (t) { - for ( - var n = arguments.length, o = new Array(n > 1 ? n - 1 : 0), r = 1; - r < n; - r++ - ) - o[r - 1] = arguments[r]; - return c(e, t, o); - }; - } - function N(e, o, r) { - var i; - (r = null !== (i = r) && void 0 !== i ? i : p), t && t(e, null); - let a = o.length; - for (; a--; ) { - let t = o[a]; - if ('string' == typeof t) { - const e = r(t); - e !== t && (n(o) || (o[a] = e), (t = e)); - } - e[t] = !0; - } - return e; - } - function S(t) { - const n = l(null); - for (const [o, r] of e(t)) n[o] = r; - return n; - } - function R(e, t) { - for (; null !== e; ) { - const n = r(e, t); - if (n) { - if (n.get) return b(n.get); - if ('function' == typeof n.value) return b(n.value); - } - e = o(e); - } - return function (e) { - return console.warn('fallback value for', e), null; - }; - } - const w = i([ - 'a', - 'abbr', - 'acronym', - 'address', - 'area', - 'article', - 'aside', - 'audio', - 'b', - 'bdi', - 'bdo', - 'big', - 'blink', - 'blockquote', - 'body', - 'br', - 'button', - 'canvas', - 'caption', - 'center', - 'cite', - 'code', - 'col', - 'colgroup', - 'content', - 'data', - 'datalist', - 'dd', - 'decorator', - 'del', - 'details', - 'dfn', - 'dialog', - 'dir', - 'div', - 'dl', - 'dt', - 'element', - 'em', - 'fieldset', - 'figcaption', - 'figure', - 'font', - 'footer', - 'form', - 'h1', - 'h2', - 'h3', - 'h4', - 'h5', - 'h6', - 'head', - 'header', - 'hgroup', - 'hr', - 'html', - 'i', - 'img', - 'input', - 'ins', - 'kbd', - 'label', - 'legend', - 'li', - 'main', - 'map', - 'mark', - 'marquee', - 'menu', - 'menuitem', - 'meter', - 'nav', - 'nobr', - 'ol', - 'optgroup', - 'option', - 'output', - 'p', - 'picture', - 'pre', - 'progress', - 'q', - 'rp', - 'rt', - 'ruby', - 's', - 'samp', - 'section', - 'select', - 'shadow', - 'small', - 'source', - 'spacer', - 'span', - 'strike', - 'strong', - 'style', - 'sub', - 'summary', - 'sup', - 'table', - 'tbody', - 'td', - 'template', - 'textarea', - 'tfoot', - 'th', - 'thead', - 'time', - 'tr', - 'track', - 'tt', - 'u', - 'ul', - 'var', - 'video', - 'wbr', - ]), - D = i([ - 'svg', - 'a', - 'altglyph', - 'altglyphdef', - 'altglyphitem', - 'animatecolor', - 'animatemotion', - 'animatetransform', - 'circle', - 'clippath', - 'defs', - 'desc', - 'ellipse', - 'filter', - 'font', - 'g', - 'glyph', - 'glyphref', - 'hkern', - 'image', - 'line', - 'lineargradient', - 'marker', - 'mask', - 'metadata', - 'mpath', - 'path', - 'pattern', - 'polygon', - 'polyline', - 'radialgradient', - 'rect', - 'stop', - 'style', - 'switch', - 'symbol', - 'text', - 'textpath', - 'title', - 'tref', - 'tspan', - 'view', - 'vkern', - ]), - L = i([ - 'feBlend', - 'feColorMatrix', - 'feComponentTransfer', - 'feComposite', - 'feConvolveMatrix', - 'feDiffuseLighting', - 'feDisplacementMap', - 'feDistantLight', - 'feDropShadow', - 'feFlood', - 'feFuncA', - 'feFuncB', - 'feFuncG', - 'feFuncR', - 'feGaussianBlur', - 'feImage', - 'feMerge', - 'feMergeNode', - 'feMorphology', - 'feOffset', - 'fePointLight', - 'feSpecularLighting', - 'feSpotLight', - 'feTile', - 'feTurbulence', - ]), - v = i([ - 'animate', - 'color-profile', - 'cursor', - 'discard', - 'font-face', - 'font-face-format', - 'font-face-name', - 'font-face-src', - 'font-face-uri', - 'foreignobject', - 'hatch', - 'hatchpath', - 'mesh', - 'meshgradient', - 'meshpatch', - 'meshrow', - 'missing-glyph', - 'script', - 'set', - 'solidcolor', - 'unknown', - 'use', - ]), - x = i([ - 'math', - 'menclose', - 'merror', - 'mfenced', - 'mfrac', - 'mglyph', - 'mi', - 'mlabeledtr', - 'mmultiscripts', - 'mn', - 'mo', - 'mover', - 'mpadded', - 'mphantom', - 'mroot', - 'mrow', - 'ms', - 'mspace', - 'msqrt', - 'mstyle', - 'msub', - 'msup', - 'msubsup', - 'mtable', - 'mtd', - 'mtext', - 'mtr', - 'munder', - 'munderover', - 'mprescripts', - ]), - C = i([ - 'maction', - 'maligngroup', - 'malignmark', - 'mlongdiv', - 'mscarries', - 'mscarry', - 'msgroup', - 'mstack', - 'msline', - 'msrow', - 'semantics', - 'annotation', - 'annotation-xml', - 'mprescripts', - 'none', - ]), - k = i(['#text']), - O = i([ - 'accept', - 'action', - 'align', - 'alt', - 'autocapitalize', - 'autocomplete', - 'autopictureinpicture', - 'autoplay', - 'background', - 'bgcolor', - 'border', - 'capture', - 'cellpadding', - 'cellspacing', - 'checked', - 'cite', - 'class', - 'clear', - 'color', - 'cols', - 'colspan', - 'controls', - 'controlslist', - 'coords', - 'crossorigin', - 'datetime', - 'decoding', - 'default', - 'dir', - 'disabled', - 'disablepictureinpicture', - 'disableremoteplayback', - 'download', - 'draggable', - 'enctype', - 'enterkeyhint', - 'face', - 'for', - 'headers', - 'height', - 'hidden', - 'high', - 'href', - 'hreflang', - 'id', - 'inputmode', - 'integrity', - 'ismap', - 'kind', - 'label', - 'lang', - 'list', - 'loading', - 'loop', - 'low', - 'max', - 'maxlength', - 'media', - 'method', - 'min', - 'minlength', - 'multiple', - 'muted', - 'name', - 'nonce', - 'noshade', - 'novalidate', - 'nowrap', - 'open', - 'optimum', - 'pattern', - 'placeholder', - 'playsinline', - 'poster', - 'preload', - 'pubdate', - 'radiogroup', - 'readonly', - 'rel', - 'required', - 'rev', - 'reversed', - 'role', - 'rows', - 'rowspan', - 'spellcheck', - 'scope', - 'selected', - 'shape', - 'size', - 'sizes', - 'span', - 'srclang', - 'start', - 'src', - 'srcset', - 'step', - 'style', - 'summary', - 'tabindex', - 'title', - 'translate', - 'type', - 'usemap', - 'valign', - 'value', - 'width', - 'xmlns', - 'slot', - ]), - I = i([ - 'accent-height', - 'accumulate', - 'additive', - 'alignment-baseline', - 'ascent', - 'attributename', - 'attributetype', - 'azimuth', - 'basefrequency', - 'baseline-shift', - 'begin', - 'bias', - 'by', - 'class', - 'clip', - 'clippathunits', - 'clip-path', - 'clip-rule', - 'color', - 'color-interpolation', - 'color-interpolation-filters', - 'color-profile', - 'color-rendering', - 'cx', - 'cy', - 'd', - 'dx', - 'dy', - 'diffuseconstant', - 'direction', - 'display', - 'divisor', - 'dur', - 'edgemode', - 'elevation', - 'end', - 'fill', - 'fill-opacity', - 'fill-rule', - 'filter', - 'filterunits', - 'flood-color', - 'flood-opacity', - 'font-family', - 'font-size', - 'font-size-adjust', - 'font-stretch', - 'font-style', - 'font-variant', - 'font-weight', - 'fx', - 'fy', - 'g1', - 'g2', - 'glyph-name', - 'glyphref', - 'gradientunits', - 'gradienttransform', - 'height', - 'href', - 'id', - 'image-rendering', - 'in', - 'in2', - 'k', - 'k1', - 'k2', - 'k3', - 'k4', - 'kerning', - 'keypoints', - 'keysplines', - 'keytimes', - 'lang', - 'lengthadjust', - 'letter-spacing', - 'kernelmatrix', - 'kernelunitlength', - 'lighting-color', - 'local', - 'marker-end', - 'marker-mid', - 'marker-start', - 'markerheight', - 'markerunits', - 'markerwidth', - 'maskcontentunits', - 'maskunits', - 'max', - 'mask', - 'media', - 'method', - 'mode', - 'min', - 'name', - 'numoctaves', - 'offset', - 'operator', - 'opacity', - 'order', - 'orient', - 'orientation', - 'origin', - 'overflow', - 'paint-order', - 'path', - 'pathlength', - 'patterncontentunits', - 'patterntransform', - 'patternunits', - 'points', - 'preservealpha', - 'preserveaspectratio', - 'primitiveunits', - 'r', - 'rx', - 'ry', - 'radius', - 'refx', - 'refy', - 'repeatcount', - 'repeatdur', - 'restart', - 'result', - 'rotate', - 'scale', - 'seed', - 'shape-rendering', - 'specularconstant', - 'specularexponent', - 'spreadmethod', - 'startoffset', - 'stddeviation', - 'stitchtiles', - 'stop-color', - 'stop-opacity', - 'stroke-dasharray', - 'stroke-dashoffset', - 'stroke-linecap', - 'stroke-linejoin', - 'stroke-miterlimit', - 'stroke-opacity', - 'stroke', - 'stroke-width', - 'style', - 'surfacescale', - 'systemlanguage', - 'tabindex', - 'targetx', - 'targety', - 'transform', - 'transform-origin', - 'text-anchor', - 'text-decoration', - 'text-rendering', - 'textlength', - 'type', - 'u1', - 'u2', - 'unicode', - 'values', - 'viewbox', - 'visibility', - 'version', - 'vert-adv-y', - 'vert-origin-x', - 'vert-origin-y', - 'width', - 'word-spacing', - 'wrap', - 'writing-mode', - 'xchannelselector', - 'ychannelselector', - 'x', - 'x1', - 'x2', - 'xmlns', - 'y', - 'y1', - 'y2', - 'z', - 'zoomandpan', - ]), - M = i([ - 'accent', - 'accentunder', - 'align', - 'bevelled', - 'close', - 'columnsalign', - 'columnlines', - 'columnspan', - 'denomalign', - 'depth', - 'dir', - 'display', - 'displaystyle', - 'encoding', - 'fence', - 'frame', - 'height', - 'href', - 'id', - 'largeop', - 'length', - 'linethickness', - 'lspace', - 'lquote', - 'mathbackground', - 'mathcolor', - 'mathsize', - 'mathvariant', - 'maxsize', - 'minsize', - 'movablelimits', - 'notation', - 'numalign', - 'open', - 'rowalign', - 'rowlines', - 'rowspacing', - 'rowspan', - 'rspace', - 'rquote', - 'scriptlevel', - 'scriptminsize', - 'scriptsizemultiplier', - 'selection', - 'separator', - 'separators', - 'stretchy', - 'subscriptshift', - 'supscriptshift', - 'symmetric', - 'voffset', - 'width', - 'xmlns', - ]), - U = i(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']), - P = a(/\{\{[\w\W]*|[\w\W]*\}\}/gm), - F = a(/<%[\w\W]*|[\w\W]*%>/gm), - H = a(/\${[\w\W]*}/gm), - z = a(/^data-[\-\w.\u00B7-\uFFFF]/), - B = a(/^aria-[\-\w]+$/), - W = a( - /^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i, - ), - G = a(/^(?:\w+script|data):/i), - Y = a(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g), - j = a(/^html$/i); - var q = Object.freeze({ - __proto__: null, - MUSTACHE_EXPR: P, - ERB_EXPR: F, - TMPLIT_EXPR: H, - DATA_ATTR: z, - ARIA_ATTR: B, - IS_ALLOWED_URI: W, - IS_SCRIPT_OR_DATA: G, - ATTR_WHITESPACE: Y, - DOCTYPE_NAME: j, - }); - const X = () => ('undefined' == typeof window ? null : window), - K = function (e, t) { - if ('object' != typeof e || 'function' != typeof e.createPolicy) - return null; - let n = null; - const o = 'data-tt-policy-suffix'; - t && t.hasAttribute(o) && (n = t.getAttribute(o)); - const r = 'dompurify' + (n ? '#' + n : ''); - try { - return e.createPolicy(r, { - createHTML: (e) => e, - createScriptURL: (e) => e, - }); - } catch (e) { - return ( - console.warn('TrustedTypes policy ' + r + ' could not be created.'), - null - ); - } - }; - var V = (function t() { - let n = - arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : X(); - const o = (e) => t(e); - if ( - ((o.version = '3.0.3'), - (o.removed = []), - !n || !n.document || 9 !== n.document.nodeType) - ) - return (o.isSupported = !1), o; - const r = n.document, - a = r.currentScript; - let { document: l } = n; - const { - DocumentFragment: c, - HTMLTemplateElement: s, - Node: _, - Element: b, - NodeFilter: P, - NamedNodeMap: F = n.NamedNodeMap || n.MozNamedAttrMap, - HTMLFormElement: H, - DOMParser: z, - trustedTypes: B, - } = n, - G = b.prototype, - Y = R(G, 'cloneNode'), - V = R(G, 'nextSibling'), - $ = R(G, 'childNodes'), - Z = R(G, 'parentNode'); - if ('function' == typeof s) { - const e = l.createElement('template'); - e.content && e.content.ownerDocument && (l = e.content.ownerDocument); - } - let J, - Q = ''; - const { - implementation: ee, - createNodeIterator: te, - createDocumentFragment: ne, - getElementsByTagName: oe, - } = l, - { importNode: re } = r; - let ie = {}; - o.isSupported = - 'function' == typeof e && - 'function' == typeof Z && - ee && - void 0 !== ee.createHTMLDocument; - const { - MUSTACHE_EXPR: ae, - ERB_EXPR: le, - TMPLIT_EXPR: ce, - DATA_ATTR: se, - ARIA_ATTR: me, - IS_SCRIPT_OR_DATA: ue, - ATTR_WHITESPACE: fe, - } = q; - let { IS_ALLOWED_URI: pe } = q, - de = null; - const he = N({}, [...w, ...D, ...L, ...x, ...k]); - let ge = null; - const Te = N({}, [...O, ...I, ...M, ...U]); - let ye = Object.seal( - Object.create(null, { - tagNameCheck: { - writable: !0, - configurable: !1, - enumerable: !0, - value: null, - }, - attributeNameCheck: { - writable: !0, - configurable: !1, - enumerable: !0, - value: null, - }, - allowCustomizedBuiltInElements: { - writable: !0, - configurable: !1, - enumerable: !0, - value: !1, - }, - }), - ), - Ee = null, - Ae = null, - _e = !0, - be = !0, - Ne = !1, - Se = !0, - Re = !1, - we = !1, - De = !1, - Le = !1, - ve = !1, - xe = !1, - Ce = !1, - ke = !0, - Oe = !1; - const Ie = 'user-content-'; - let Me = !0, - Ue = !1, - Pe = {}, - Fe = null; - const He = N({}, [ - 'annotation-xml', - 'audio', - 'colgroup', - 'desc', - 'foreignobject', - 'head', - 'iframe', - 'math', - 'mi', - 'mn', - 'mo', - 'ms', - 'mtext', - 'noembed', - 'noframes', - 'noscript', - 'plaintext', - 'script', - 'style', - 'svg', - 'template', - 'thead', - 'title', - 'video', - 'xmp', - ]); - let ze = null; - const Be = N({}, ['audio', 'video', 'img', 'source', 'image', 'track']); - let We = null; - const Ge = N({}, [ - 'alt', - 'class', - 'for', - 'id', - 'label', - 'name', - 'pattern', - 'placeholder', - 'role', - 'summary', - 'title', - 'value', - 'style', - 'xmlns', - ]), - Ye = 'http://www.w3.org/1998/Math/MathML', - je = 'http://www.w3.org/2000/svg', - qe = 'http://www.w3.org/1999/xhtml'; - let Xe = qe, - Ke = !1, - Ve = null; - const $e = N({}, [Ye, je, qe], d); - let Ze; - const Je = ['application/xhtml+xml', 'text/html'], - Qe = 'text/html'; - let et, - tt = null; - const nt = l.createElement('form'), - ot = function (e) { - return e instanceof RegExp || e instanceof Function; - }, - rt = function (e) { - if (!tt || tt !== e) { - if ( - ((e && 'object' == typeof e) || (e = {}), - (e = S(e)), - (Ze = Ze = - -1 === Je.indexOf(e.PARSER_MEDIA_TYPE) - ? Qe - : e.PARSER_MEDIA_TYPE), - (et = 'application/xhtml+xml' === Ze ? d : p), - (de = 'ALLOWED_TAGS' in e ? N({}, e.ALLOWED_TAGS, et) : he), - (ge = 'ALLOWED_ATTR' in e ? N({}, e.ALLOWED_ATTR, et) : Te), - (Ve = - 'ALLOWED_NAMESPACES' in e ? N({}, e.ALLOWED_NAMESPACES, d) : $e), - (We = - 'ADD_URI_SAFE_ATTR' in e - ? N(S(Ge), e.ADD_URI_SAFE_ATTR, et) - : Ge), - (ze = - 'ADD_DATA_URI_TAGS' in e - ? N(S(Be), e.ADD_DATA_URI_TAGS, et) - : Be), - (Fe = 'FORBID_CONTENTS' in e ? N({}, e.FORBID_CONTENTS, et) : He), - (Ee = 'FORBID_TAGS' in e ? N({}, e.FORBID_TAGS, et) : {}), - (Ae = 'FORBID_ATTR' in e ? N({}, e.FORBID_ATTR, et) : {}), - (Pe = 'USE_PROFILES' in e && e.USE_PROFILES), - (_e = !1 !== e.ALLOW_ARIA_ATTR), - (be = !1 !== e.ALLOW_DATA_ATTR), - (Ne = e.ALLOW_UNKNOWN_PROTOCOLS || !1), - (Se = !1 !== e.ALLOW_SELF_CLOSE_IN_ATTR), - (Re = e.SAFE_FOR_TEMPLATES || !1), - (we = e.WHOLE_DOCUMENT || !1), - (ve = e.RETURN_DOM || !1), - (xe = e.RETURN_DOM_FRAGMENT || !1), - (Ce = e.RETURN_TRUSTED_TYPE || !1), - (Le = e.FORCE_BODY || !1), - (ke = !1 !== e.SANITIZE_DOM), - (Oe = e.SANITIZE_NAMED_PROPS || !1), - (Me = !1 !== e.KEEP_CONTENT), - (Ue = e.IN_PLACE || !1), - (pe = e.ALLOWED_URI_REGEXP || W), - (Xe = e.NAMESPACE || qe), - (ye = e.CUSTOM_ELEMENT_HANDLING || {}), - e.CUSTOM_ELEMENT_HANDLING && - ot(e.CUSTOM_ELEMENT_HANDLING.tagNameCheck) && - (ye.tagNameCheck = e.CUSTOM_ELEMENT_HANDLING.tagNameCheck), - e.CUSTOM_ELEMENT_HANDLING && - ot(e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck) && - (ye.attributeNameCheck = - e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck), - e.CUSTOM_ELEMENT_HANDLING && - 'boolean' == - typeof e.CUSTOM_ELEMENT_HANDLING - .allowCustomizedBuiltInElements && - (ye.allowCustomizedBuiltInElements = - e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements), - Re && (be = !1), - xe && (ve = !0), - Pe && - ((de = N({}, [...k])), - (ge = []), - !0 === Pe.html && (N(de, w), N(ge, O)), - !0 === Pe.svg && (N(de, D), N(ge, I), N(ge, U)), - !0 === Pe.svgFilters && (N(de, L), N(ge, I), N(ge, U)), - !0 === Pe.mathMl && (N(de, x), N(ge, M), N(ge, U))), - e.ADD_TAGS && (de === he && (de = S(de)), N(de, e.ADD_TAGS, et)), - e.ADD_ATTR && (ge === Te && (ge = S(ge)), N(ge, e.ADD_ATTR, et)), - e.ADD_URI_SAFE_ATTR && N(We, e.ADD_URI_SAFE_ATTR, et), - e.FORBID_CONTENTS && - (Fe === He && (Fe = S(Fe)), N(Fe, e.FORBID_CONTENTS, et)), - Me && (de['#text'] = !0), - we && N(de, ['html', 'head', 'body']), - de.table && (N(de, ['tbody']), delete Ee.tbody), - e.TRUSTED_TYPES_POLICY) - ) { - if ('function' != typeof e.TRUSTED_TYPES_POLICY.createHTML) - throw A( - 'TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.', - ); - if ('function' != typeof e.TRUSTED_TYPES_POLICY.createScriptURL) - throw A( - 'TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.', - ); - (J = e.TRUSTED_TYPES_POLICY), (Q = J.createHTML('')); - } else - void 0 === J && (J = K(B, a)), - null !== J && 'string' == typeof Q && (Q = J.createHTML('')); - i && i(e), (tt = e); - } - }, - it = N({}, ['mi', 'mo', 'mn', 'ms', 'mtext']), - at = N({}, ['foreignobject', 'desc', 'title', 'annotation-xml']), - lt = N({}, ['title', 'style', 'font', 'a', 'script']), - ct = N({}, D); - N(ct, L), N(ct, v); - const st = N({}, x); - N(st, C); - const mt = function (e) { - let t = Z(e); - (t && t.tagName) || (t = { namespaceURI: Xe, tagName: 'template' }); - const n = p(e.tagName), - o = p(t.tagName); - return ( - !!Ve[e.namespaceURI] && - (e.namespaceURI === je - ? t.namespaceURI === qe - ? 'svg' === n - : t.namespaceURI === Ye - ? 'svg' === n && ('annotation-xml' === o || it[o]) - : Boolean(ct[n]) - : e.namespaceURI === Ye - ? t.namespaceURI === qe - ? 'math' === n - : t.namespaceURI === je - ? 'math' === n && at[o] - : Boolean(st[n]) - : e.namespaceURI === qe - ? !(t.namespaceURI === je && !at[o]) && - !(t.namespaceURI === Ye && !it[o]) && - !st[n] && - (lt[n] || !ct[n]) - : !('application/xhtml+xml' !== Ze || !Ve[e.namespaceURI])) - ); - }, - ut = function (e) { - f(o.removed, { element: e }); - try { - e.parentNode.removeChild(e); - } catch (t) { - e.remove(); - } - }, - ft = function (e, t) { - try { - f(o.removed, { attribute: t.getAttributeNode(e), from: t }); - } catch (e) { - f(o.removed, { attribute: null, from: t }); - } - if ((t.removeAttribute(e), 'is' === e && !ge[e])) - if (ve || xe) - try { - ut(t); - } catch (e) {} - else - try { - t.setAttribute(e, ''); - } catch (e) {} - }, - pt = function (e) { - let t, n; - if (Le) e = '' + e; - else { - const t = h(e, /^[\r\n\t ]+/); - n = t && t[0]; - } - 'application/xhtml+xml' === Ze && - Xe === qe && - (e = - '' + - e + - ''); - const o = J ? J.createHTML(e) : e; - if (Xe === qe) - try { - t = new z().parseFromString(o, Ze); - } catch (e) {} - if (!t || !t.documentElement) { - t = ee.createDocument(Xe, 'template', null); - try { - t.documentElement.innerHTML = Ke ? Q : o; - } catch (e) {} - } - const r = t.body || t.documentElement; - return ( - e && - n && - r.insertBefore(l.createTextNode(n), r.childNodes[0] || null), - Xe === qe - ? oe.call(t, we ? 'html' : 'body')[0] - : we - ? t.documentElement - : r - ); - }, - dt = function (e) { - return te.call( - e.ownerDocument || e, - e, - P.SHOW_ELEMENT | P.SHOW_COMMENT | P.SHOW_TEXT, - null, - !1, - ); - }, - ht = function (e) { - return ( - e instanceof H && - ('string' != typeof e.nodeName || - 'string' != typeof e.textContent || - 'function' != typeof e.removeChild || - !(e.attributes instanceof F) || - 'function' != typeof e.removeAttribute || - 'function' != typeof e.setAttribute || - 'string' != typeof e.namespaceURI || - 'function' != typeof e.insertBefore || - 'function' != typeof e.hasChildNodes) - ); - }, - gt = function (e) { - return 'object' == typeof _ - ? e instanceof _ - : e && - 'object' == typeof e && - 'number' == typeof e.nodeType && - 'string' == typeof e.nodeName; - }, - Tt = function (e, t, n) { - ie[e] && - m(ie[e], (e) => { - e.call(o, t, n, tt); - }); - }, - yt = function (e) { - let t; - if ((Tt('beforeSanitizeElements', e, null), ht(e))) return ut(e), !0; - const n = et(e.nodeName); - if ( - (Tt('uponSanitizeElement', e, { tagName: n, allowedTags: de }), - e.hasChildNodes() && - !gt(e.firstElementChild) && - (!gt(e.content) || !gt(e.content.firstElementChild)) && - E(/<[/\w]/g, e.innerHTML) && - E(/<[/\w]/g, e.textContent)) - ) - return ut(e), !0; - if (!de[n] || Ee[n]) { - if (!Ee[n] && At(n)) { - if (ye.tagNameCheck instanceof RegExp && E(ye.tagNameCheck, n)) - return !1; - if (ye.tagNameCheck instanceof Function && ye.tagNameCheck(n)) - return !1; - } - if (Me && !Fe[n]) { - const t = Z(e) || e.parentNode, - n = $(e) || e.childNodes; - if (n && t) { - for (let o = n.length - 1; o >= 0; --o) - t.insertBefore(Y(n[o], !0), V(e)); - } - } - return ut(e), !0; - } - return e instanceof b && !mt(e) - ? (ut(e), !0) - : ('noscript' !== n && 'noembed' !== n) || - !E(/<\/no(script|embed)/i, e.innerHTML) - ? (Re && - 3 === e.nodeType && - ((t = e.textContent), - (t = g(t, ae, ' ')), - (t = g(t, le, ' ')), - (t = g(t, ce, ' ')), - e.textContent !== t && - (f(o.removed, { element: e.cloneNode() }), - (e.textContent = t))), - Tt('afterSanitizeElements', e, null), - !1) - : (ut(e), !0); - }, - Et = function (e, t, n) { - if (ke && ('id' === t || 'name' === t) && (n in l || n in nt)) - return !1; - if (be && !Ae[t] && E(se, t)); - else if (_e && E(me, t)); - else if (!ge[t] || Ae[t]) { - if ( - !( - (At(e) && - ((ye.tagNameCheck instanceof RegExp && E(ye.tagNameCheck, e)) || - (ye.tagNameCheck instanceof Function && - ye.tagNameCheck(e))) && - ((ye.attributeNameCheck instanceof RegExp && - E(ye.attributeNameCheck, t)) || - (ye.attributeNameCheck instanceof Function && - ye.attributeNameCheck(t)))) || - ('is' === t && - ye.allowCustomizedBuiltInElements && - ((ye.tagNameCheck instanceof RegExp && E(ye.tagNameCheck, n)) || - (ye.tagNameCheck instanceof Function && ye.tagNameCheck(n)))) - ) - ) - return !1; - } else if (We[t]); - else if (E(pe, g(n, fe, ''))); - else if ( - ('src' !== t && 'xlink:href' !== t && 'href' !== t) || - 'script' === e || - 0 !== T(n, 'data:') || - !ze[e] - ) { - if (Ne && !E(ue, g(n, fe, ''))); - else if (n) return !1; - } else; - return !0; - }, - At = function (e) { - return e.indexOf('-') > 0; - }, - _t = function (e) { - let t, n, r, i; - Tt('beforeSanitizeAttributes', e, null); - const { attributes: a } = e; - if (!a) return; - const l = { - attrName: '', - attrValue: '', - keepAttr: !0, - allowedAttributes: ge, - }; - for (i = a.length; i--; ) { - t = a[i]; - const { name: c, namespaceURI: s } = t; - if ( - ((n = 'value' === c ? t.value : y(t.value)), - (r = et(c)), - (l.attrName = r), - (l.attrValue = n), - (l.keepAttr = !0), - (l.forceKeepAttr = void 0), - Tt('uponSanitizeAttribute', e, l), - (n = l.attrValue), - l.forceKeepAttr) - ) - continue; - if ((ft(c, e), !l.keepAttr)) continue; - if (!Se && E(/\/>/i, n)) { - ft(c, e); - continue; - } - Re && ((n = g(n, ae, ' ')), (n = g(n, le, ' ')), (n = g(n, ce, ' '))); - const m = et(e.nodeName); - if (Et(m, r, n)) { - if ( - (!Oe || ('id' !== r && 'name' !== r) || (ft(c, e), (n = Ie + n)), - J && - 'object' == typeof B && - 'function' == typeof B.getAttributeType) - ) - if (s); - else - switch (B.getAttributeType(m, r)) { - case 'TrustedHTML': - n = J.createHTML(n); - break; - case 'TrustedScriptURL': - n = J.createScriptURL(n); - } - try { - s ? e.setAttributeNS(s, c, n) : e.setAttribute(c, n), - u(o.removed); - } catch (e) {} - } - } - Tt('afterSanitizeAttributes', e, null); - }, - bt = function e(t) { - let n; - const o = dt(t); - for (Tt('beforeSanitizeShadowDOM', t, null); (n = o.nextNode()); ) - Tt('uponSanitizeShadowNode', n, null), - yt(n) || (n.content instanceof c && e(n.content), _t(n)); - Tt('afterSanitizeShadowDOM', t, null); - }; - return ( - (o.sanitize = function (e) { - let t, - n, - i, - a, - l = - arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}; - if ( - ((Ke = !e), Ke && (e = '\x3c!--\x3e'), 'string' != typeof e && !gt(e)) - ) { - if ('function' != typeof e.toString) - throw A('toString is not a function'); - if ('string' != typeof (e = e.toString())) - throw A('dirty is not a string, aborting'); - } - if (!o.isSupported) return e; - if ( - (De || rt(l), (o.removed = []), 'string' == typeof e && (Ue = !1), Ue) - ) { - if (e.nodeName) { - const t = et(e.nodeName); - if (!de[t] || Ee[t]) - throw A( - 'root node is forbidden and cannot be sanitized in-place', - ); - } - } else if (e instanceof _) - (t = pt('\x3c!----\x3e')), - (n = t.ownerDocument.importNode(e, !0)), - (1 === n.nodeType && 'BODY' === n.nodeName) || 'HTML' === n.nodeName - ? (t = n) - : t.appendChild(n); - else { - if (!ve && !Re && !we && -1 === e.indexOf('<')) - return J && Ce ? J.createHTML(e) : e; - if (((t = pt(e)), !t)) return ve ? null : Ce ? Q : ''; - } - t && Le && ut(t.firstChild); - const s = dt(Ue ? e : t); - for (; (i = s.nextNode()); ) - yt(i) || (i.content instanceof c && bt(i.content), _t(i)); - if (Ue) return e; - if (ve) { - if (xe) - for (a = ne.call(t.ownerDocument); t.firstChild; ) - a.appendChild(t.firstChild); - else a = t; - return ( - (ge.shadowroot || ge.shadowrootmod) && (a = re.call(r, a, !0)), a - ); - } - let m = we ? t.outerHTML : t.innerHTML; - return ( - we && - de['!doctype'] && - t.ownerDocument && - t.ownerDocument.doctype && - t.ownerDocument.doctype.name && - E(j, t.ownerDocument.doctype.name) && - (m = '\n' + m), - Re && ((m = g(m, ae, ' ')), (m = g(m, le, ' ')), (m = g(m, ce, ' '))), - J && Ce ? J.createHTML(m) : m - ); - }), - (o.setConfig = function (e) { - rt(e), (De = !0); - }), - (o.clearConfig = function () { - (tt = null), (De = !1); - }), - (o.isValidAttribute = function (e, t, n) { - tt || rt({}); - const o = et(e), - r = et(t); - return Et(o, r, n); - }), - (o.addHook = function (e, t) { - 'function' == typeof t && ((ie[e] = ie[e] || []), f(ie[e], t)); - }), - (o.removeHook = function (e) { - if (ie[e]) return u(ie[e]); - }), - (o.removeHooks = function (e) { - ie[e] && (ie[e] = []); - }), - (o.removeAllHooks = function () { - ie = {}; - }), - o - ); - })(); - return V; -}); -//# sourceMappingURL=purify.min.js.map diff --git a/src/SEQTA.ts b/src/SEQTA.ts index 84037667..32310e04 100644 --- a/src/SEQTA.ts +++ b/src/SEQTA.ts @@ -1,26 +1,7 @@ /* eslint-disable no-inner-declarations */ import * as Sentry from "@sentry/browser"; - -browser.storage.local.get([ "telemetry" ]).then((telemetry) => { - if (telemetry.telemetry === true) { - Sentry.init({ - dsn: "https://54bdb68e80b45182ded22ecf9fe9529c@o4506347383291904.ingest.sentry.io/4506347462393856", - integrations: [ - new Sentry.BrowserTracing({ - // Set 'tracePropagationTargets' to control for which URLs distributed tracing should be enabled - tracePropagationTargets: ["localhost", /^https:\/\/yourserver\.io\/api/], - }), - new Sentry.Replay(), - ], - // Performance Monitoring - tracesSampleRate: 1.0, // Capture 100% of the transactions - // Session Replay - replaysSessionSampleRate: 0.1, // This sets the sample rate at 10%. You may want to change it to 100% while in development and then sample at a lower rate in production. - replaysOnErrorSampleRate: 1.0, // If you're not already sampling the entire session, change the sample rate to 100% when sampling sessions where errors occur. - }); - } -}) import browser from 'webextension-polyfill'; + import { animate, spring, stagger } from 'motion'; import Color from 'color'; import Sortable from 'sortablejs'; @@ -44,6 +25,26 @@ import { enableCurrentTheme } from './seqta/ui/Themes'; import { delay } from "./seqta/utils/delay"; import { SettingsState } from "./types/storage"; +browser.storage.local.get([ "telemetry" ]).then((telemetry) => { + if (telemetry.telemetry === true) { + Sentry.init({ + dsn: "https://54bdb68e80b45182ded22ecf9fe9529c@o4506347383291904.ingest.sentry.io/4506347462393856", + integrations: [ + new Sentry.BrowserTracing({ + // Set 'tracePropagationTargets' to control for which URLs distributed tracing should be enabled + tracePropagationTargets: ["localhost", /^https:\/\/yourserver\.io\/api/], + }), + new Sentry.Replay(), + ], + // Performance Monitoring + tracesSampleRate: 1.0, // Capture 100% of the transactions + // Session Replay + replaysSessionSampleRate: 0.1, // This sets the sample rate at 10%. You may want to change it to 100% while in development and then sample at a lower rate in production. + replaysOnErrorSampleRate: 1.0, // If you're not already sampling the entire session, change the sample rate to 100% when sampling sessions where errors occur. + }); + } +}) + declare global { interface Window { chrome?: any; @@ -73,8 +74,9 @@ document.addEventListener( IsSEQTAPage = true; console.log('[BetterSEQTA+] Verified SEQTA Page'); - const link = GetCSSElement('css/documentload.css'); - document.getElementsByTagName('html')[0].appendChild(link); + import('./css/documentload.scss'); + /* const link = GetCSSElement(); + document.getElementsByTagName('html')[0].appendChild(link); */ enableCurrentTheme(); try { @@ -424,6 +426,7 @@ function removeThemeTagsFromNotices () { function CheckiFrameItems() { // Injecting CSS File to the webpage to overwrite iFrame default CSS + import('./css/iframe.scss'); let fileref = GetCSSElement('css/iframe.css'); const observer = new MutationObserver(function (mutations_list) { @@ -733,6 +736,7 @@ function main(storedSetting: SettingsState) { } function InjectStyles() { + import('./css/injected.scss'); const inject = GetCSSElement('css/injected.css'); document.head.appendChild(inject); document.getElementsByTagName('html')[0].appendChild(inject); @@ -1354,7 +1358,6 @@ async function AddBetterSEQTAElements(toggle: any) { } } - function GetLightDarkModeString(darkmodetoggle: boolean) { let tooltipstring; diff --git a/src/background.ts b/src/background.ts index 6ceb2df2..8c586e86 100644 --- a/src/background.ts +++ b/src/background.ts @@ -1,4 +1,5 @@ import * as Sentry from "@sentry/browser"; +import browser from 'webextension-polyfill' browser.storage.local.get([ "telemetry" ]).then((telemetry) => { if (telemetry.telemetry === true) { @@ -20,7 +21,6 @@ browser.storage.local.get([ "telemetry" ]).then((telemetry) => { } }) -import browser from 'webextension-polyfill' import { onError } from './seqta/utils/onError'; export const openDB = () => { return new Promise((resolve, reject) => { diff --git a/src/css/iframe.scss b/src/css/iframe.scss index 17cef99b..7b733a2b 100644 --- a/src/css/iframe.scss +++ b/src/css/iframe.scss @@ -69,7 +69,6 @@ table th { html, p, div, span { color: white !important; - background-color: #232323; } body { background-color: #232323; diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 00000000..3d6f9710 --- /dev/null +++ b/vite.config.js @@ -0,0 +1,14 @@ +import { defineConfig } from 'vite' +import { crx } from '@crxjs/vite-plugin' +import manifest from './manifest.json' + +export default defineConfig({ + plugins: [crx({ manifest })], + server: { + port: 3004, + hmr: { + port: 8989, + overlay: false, + } + } +}) \ No newline at end of file diff --git a/webpack.config.js b/webpack.config.js deleted file mode 100644 index d1f3eac7..00000000 --- a/webpack.config.js +++ /dev/null @@ -1,87 +0,0 @@ -import path from 'path'; -import MiniCssExtractPlugin from 'mini-css-extract-plugin'; -import CopyWebpackPlugin from 'copy-webpack-plugin'; -import ESLintPlugin from 'eslint-webpack-plugin'; -import { sentryWebpackPlugin } from '@sentry/webpack-plugin'; - - -export default { - target: 'web', - node: { - __dirname: true - }, - performance: { - hints: false, - maxEntrypointSize: 512000, - maxAssetSize: 512000, - }, - devtool: 'source-map', - entry: { - SEQTA: './src/SEQTA.ts', - background: './src/background.ts', - 'css/documentload': './src/css/documentload.scss', - 'css/iframe': './src/css/iframe.scss', - 'css/injected': './src/css/injected.scss', - }, - output: { - filename: (pathData) => { - const name = pathData.chunk.name.replace('css-', ''); - return name.includes('css') ? `css/${name}.js` : `${name}.js`; - }, - // eslint-disable-next-line no-undef - path: path.resolve('build'), - publicPath: '', - }, - module: { - rules: [ - { - test: /\.(css|scss)$/, - use: [ - MiniCssExtractPlugin.loader, - { - loader: 'css-loader', - options: { - importLoaders: 2 - } - }, - 'sass-loader' - ] - }, - { - test: /\.(png|svg|jpg|jpeg|gif)$/i, - type: 'asset/resource', - generator: { - filename: 'src/[path][name][ext]', - }, - }, - { - test: /\.tsx?$/, - use: 'ts-loader', - exclude: /node_modules/, - } - ], - }, - resolve: { - extensions: ['.tsx', '.ts', '.js'], - }, - plugins: [ - new ESLintPlugin(), - new MiniCssExtractPlugin({ - filename: '[name].css' - }), - new CopyWebpackPlugin({ - patterns: [ - { from: 'public', to: '.' }, - { from: 'src/css/preview', to: 'css/preview' }, - { from: 'node_modules/webextension-polyfill/dist/browser-polyfill.js' }, - { from: 'interface/dist/client', to: 'client' }, - { from: 'interface/dist/index.html', to: 'interface/index.html' } - ], - }), - sentryWebpackPlugin({ - authToken: process.env.SENTRY_AUTH_TOKEN, - org: "betterseqta-plus", - project: "betterseqtaplus-main", - }), - ], -}; From 576220a04f221e4a190ae69882eeaeb5441a7d86 Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Mon, 18 Dec 2023 07:50:03 +1100 Subject: [PATCH 02/46] fix stylesheets loading incorrectly --- src/SEQTA.ts | 8 ++++++-- src/css/iframe.scss | 1 + 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/SEQTA.ts b/src/SEQTA.ts index 32310e04..54c6ccd5 100644 --- a/src/SEQTA.ts +++ b/src/SEQTA.ts @@ -25,6 +25,8 @@ import { enableCurrentTheme } from './seqta/ui/Themes'; import { delay } from "./seqta/utils/delay"; import { SettingsState } from "./types/storage"; +import iframeCSS from "./css/iframe.scss?inline"; + browser.storage.local.get([ "telemetry" ]).then((telemetry) => { if (telemetry.telemetry === true) { Sentry.init({ @@ -426,8 +428,10 @@ function removeThemeTagsFromNotices () { function CheckiFrameItems() { // Injecting CSS File to the webpage to overwrite iFrame default CSS - import('./css/iframe.scss'); - let fileref = GetCSSElement('css/iframe.css'); + const fileref = document.createElement('link') + fileref.setAttribute('rel', 'stylesheet') + fileref.setAttribute('type', 'text/css') + fileref.innerHTML = iframeCSS const observer = new MutationObserver(function (mutations_list) { mutations_list.forEach(function (mutation) { diff --git a/src/css/iframe.scss b/src/css/iframe.scss index 7b733a2b..fe69fde5 100644 --- a/src/css/iframe.scss +++ b/src/css/iframe.scss @@ -69,6 +69,7 @@ table th { html, p, div, span { color: white !important; + background-color: #232323 } body { background-color: #232323; From 531c9dd25a039494d6067205bf142f4bd228e2ec Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Mon, 18 Dec 2023 07:52:56 +1100 Subject: [PATCH 03/46] cleanup imports --- src/SEQTA.ts | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/SEQTA.ts b/src/SEQTA.ts index 54c6ccd5..bdc34ffb 100644 --- a/src/SEQTA.ts +++ b/src/SEQTA.ts @@ -1,31 +1,32 @@ -/* eslint-disable no-inner-declarations */ import * as Sentry from "@sentry/browser"; import browser from 'webextension-polyfill'; import { animate, spring, stagger } from 'motion'; -import Color from 'color'; import Sortable from 'sortablejs'; +import Color from 'color'; -import ShortcutLinks from './seqta/content/links.json'; import MenuitemSVGKey from './seqta/content/MenuItemSVGKey.json'; -import stringToHTML from './seqta/utils/stringToHTML'; +import ShortcutLinks from './seqta/content/links.json'; + +import { appendBackgroundToUI } from './seqta/ui/ImageBackgrounds'; import loading, { AppendLoadingSymbol } from './seqta/ui/Loading'; +import { MessageHandler } from './seqta/utils/MessageListener'; +import { updateAllColors } from './seqta/ui/colors/Manager'; +import StorageListener from './seqta/utils/StorageListener'; +import { updateBgDurations } from './seqta/ui/Animation'; +import { enableCurrentTheme } from './seqta/ui/Themes'; +import stringToHTML from './seqta/utils/stringToHTML'; import { response } from './seqta/utils/GetPrefs'; +import { SettingsState } from "./types/storage"; import { onError } from './seqta/utils/onError'; +import { delay } from "./seqta/utils/delay"; + +import iframeCSS from "./css/iframe.scss?inline"; // Icons import assessmentsicon from './seqta/icons/assessmentsIcon'; import coursesicon from './seqta/icons/coursesIcon'; -import StorageListener from './seqta/utils/StorageListener'; -import { MessageHandler } from './seqta/utils/MessageListener'; -import { updateBgDurations } from './seqta/ui/Animation'; -import { updateAllColors } from './seqta/ui/colors/Manager'; -import { appendBackgroundToUI } from './seqta/ui/ImageBackgrounds'; -import { enableCurrentTheme } from './seqta/ui/Themes'; -import { delay } from "./seqta/utils/delay"; -import { SettingsState } from "./types/storage"; -import iframeCSS from "./css/iframe.scss?inline"; browser.storage.local.get([ "telemetry" ]).then((telemetry) => { if (telemetry.telemetry === true) { From 9a49922db1496c2570a2d843df61b8e045458072 Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Mon, 18 Dec 2023 07:55:51 +1100 Subject: [PATCH 04/46] add pnpm-lock to gitignore --- .gitignore | 1 + interface/index.html | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 57926556..9ce31bc0 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ node_modules/ package-lock.json bun.lockb +pnpm-lock.yaml # Build package.zip diff --git a/interface/index.html b/interface/index.html index 2f1b4e8e..3e18be74 100644 --- a/interface/index.html +++ b/interface/index.html @@ -8,7 +8,7 @@
- + From bf9e26cd68edf7e375abd4fb9914d91256eaafff Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Mon, 18 Dec 2023 08:04:44 +1100 Subject: [PATCH 05/46] merge interface with main script --- interface/.eslintrc.cjs | 26 - interface/.gitignore | 9 - interface/{src => }/SettingsContext.tsx | 0 interface/{src => }/SettingsPage.tsx | 0 .../assets/betterseqta-dark-full.png | Bin .../assets/betterseqta-light-full.png | Bin .../{src => }/assets/presetBackgrounds.tsx | 0 interface/{src => }/assets/react.svg | 0 .../{src => }/assets/themeCovers/hacker.jpeg | Bin interface/{src => }/assets/themes.tsx | 0 .../components/BackgroundSelector.css | 0 .../components/BackgroundSelector.tsx | 0 interface/{src => }/components/Picker.css | 0 interface/{src => }/components/Picker.tsx | 0 .../{src => }/components/PickerSwatch.tsx | 0 interface/{src => }/components/Slider.css | 0 interface/{src => }/components/Slider.tsx | 0 interface/{src => }/components/Switch.css | 0 interface/{src => }/components/Switch.tsx | 0 .../{src => }/components/TabbedContainer.tsx | 0 .../{src => }/components/ThemeSelector.tsx | 0 .../{src => }/hooks/BackgroundDataLoader.tsx | 0 interface/{src => }/hooks/ThemeManagment.tsx | 0 interface/{src => }/hooks/settingsState.ts | 0 interface/{src => }/index.css | 0 interface/index.html | 2 +- interface/{src => }/main.d.ts | 0 interface/{src => }/main.tsx | 0 interface/package.json | 40 - interface/{src => }/pages/About.tsx | 0 interface/{src => }/pages/Settings.tsx | 0 interface/{src => }/pages/Shortcuts.tsx | 0 interface/{src => }/pages/Themes.tsx | 0 interface/pnpm-lock.yaml | 2611 ----------------- interface/postcss.config.js | 9 - interface/tailwind.config.js | 37 - interface/tsconfig.json | 24 - interface/{src => }/types/AppProps.ts | 0 interface/{src => }/types/ColorPickerProps.ts | 0 interface/{src => }/types/SettingsProps.ts | 0 interface/{src => }/types/SliderProps.ts | 0 interface/{src => }/types/SwitchProps.ts | 0 .../{src => }/types/TabbedContainerProps.ts | 0 interface/{src => }/vite-env.d.ts | 0 interface/vite.config.d.ts | 2 - interface/vite.config.ts | 23 - package.json | 5 + tailwind.config.js | 38 +- 48 files changed, 33 insertions(+), 2793 deletions(-) delete mode 100644 interface/.eslintrc.cjs delete mode 100644 interface/.gitignore rename interface/{src => }/SettingsContext.tsx (100%) rename interface/{src => }/SettingsPage.tsx (100%) rename interface/{src => }/assets/betterseqta-dark-full.png (100%) rename interface/{src => }/assets/betterseqta-light-full.png (100%) rename interface/{src => }/assets/presetBackgrounds.tsx (100%) rename interface/{src => }/assets/react.svg (100%) rename interface/{src => }/assets/themeCovers/hacker.jpeg (100%) rename interface/{src => }/assets/themes.tsx (100%) rename interface/{src => }/components/BackgroundSelector.css (100%) rename interface/{src => }/components/BackgroundSelector.tsx (100%) rename interface/{src => }/components/Picker.css (100%) rename interface/{src => }/components/Picker.tsx (100%) rename interface/{src => }/components/PickerSwatch.tsx (100%) rename interface/{src => }/components/Slider.css (100%) rename interface/{src => }/components/Slider.tsx (100%) rename interface/{src => }/components/Switch.css (100%) rename interface/{src => }/components/Switch.tsx (100%) rename interface/{src => }/components/TabbedContainer.tsx (100%) rename interface/{src => }/components/ThemeSelector.tsx (100%) rename interface/{src => }/hooks/BackgroundDataLoader.tsx (100%) rename interface/{src => }/hooks/ThemeManagment.tsx (100%) rename interface/{src => }/hooks/settingsState.ts (100%) rename interface/{src => }/index.css (100%) rename interface/{src => }/main.d.ts (100%) rename interface/{src => }/main.tsx (100%) delete mode 100644 interface/package.json rename interface/{src => }/pages/About.tsx (100%) rename interface/{src => }/pages/Settings.tsx (100%) rename interface/{src => }/pages/Shortcuts.tsx (100%) rename interface/{src => }/pages/Themes.tsx (100%) delete mode 100644 interface/pnpm-lock.yaml delete mode 100644 interface/postcss.config.js delete mode 100644 interface/tailwind.config.js delete mode 100644 interface/tsconfig.json rename interface/{src => }/types/AppProps.ts (100%) rename interface/{src => }/types/ColorPickerProps.ts (100%) rename interface/{src => }/types/SettingsProps.ts (100%) rename interface/{src => }/types/SliderProps.ts (100%) rename interface/{src => }/types/SwitchProps.ts (100%) rename interface/{src => }/types/TabbedContainerProps.ts (100%) rename interface/{src => }/vite-env.d.ts (100%) delete mode 100644 interface/vite.config.d.ts delete mode 100644 interface/vite.config.ts diff --git a/interface/.eslintrc.cjs b/interface/.eslintrc.cjs deleted file mode 100644 index 2e04b2a0..00000000 --- a/interface/.eslintrc.cjs +++ /dev/null @@ -1,26 +0,0 @@ -module.exports = { - root: true, - env: { browser: true, es2020: true }, - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:react-hooks/recommended', - ], - ignorePatterns: ['dist', '.eslintrc.cjs'], - parser: '@typescript-eslint/parser', - plugins: ['react-refresh'], - rules: { - 'react-refresh/only-export-components': [ - 'warn', - { allowConstantExport: true }, - ], - }, - overrides: [ - { - files: ['*.ts', '*.tsx'], - rules: { - '@typescript-eslint/no-explicit-any': 'off', - }, - }, - ], -} diff --git a/interface/.gitignore b/interface/.gitignore deleted file mode 100644 index 3f74bee3..00000000 --- a/interface/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ - -# Sentry Config File -.env.sentry-build-plugin - -# Sentry Config File -.env.sentry-build-plugin - -# Sentry Config File -.env.sentry-build-plugin diff --git a/interface/src/SettingsContext.tsx b/interface/SettingsContext.tsx similarity index 100% rename from interface/src/SettingsContext.tsx rename to interface/SettingsContext.tsx diff --git a/interface/src/SettingsPage.tsx b/interface/SettingsPage.tsx similarity index 100% rename from interface/src/SettingsPage.tsx rename to interface/SettingsPage.tsx diff --git a/interface/src/assets/betterseqta-dark-full.png b/interface/assets/betterseqta-dark-full.png similarity index 100% rename from interface/src/assets/betterseqta-dark-full.png rename to interface/assets/betterseqta-dark-full.png diff --git a/interface/src/assets/betterseqta-light-full.png b/interface/assets/betterseqta-light-full.png similarity index 100% rename from interface/src/assets/betterseqta-light-full.png rename to interface/assets/betterseqta-light-full.png diff --git a/interface/src/assets/presetBackgrounds.tsx b/interface/assets/presetBackgrounds.tsx similarity index 100% rename from interface/src/assets/presetBackgrounds.tsx rename to interface/assets/presetBackgrounds.tsx diff --git a/interface/src/assets/react.svg b/interface/assets/react.svg similarity index 100% rename from interface/src/assets/react.svg rename to interface/assets/react.svg diff --git a/interface/src/assets/themeCovers/hacker.jpeg b/interface/assets/themeCovers/hacker.jpeg similarity index 100% rename from interface/src/assets/themeCovers/hacker.jpeg rename to interface/assets/themeCovers/hacker.jpeg diff --git a/interface/src/assets/themes.tsx b/interface/assets/themes.tsx similarity index 100% rename from interface/src/assets/themes.tsx rename to interface/assets/themes.tsx diff --git a/interface/src/components/BackgroundSelector.css b/interface/components/BackgroundSelector.css similarity index 100% rename from interface/src/components/BackgroundSelector.css rename to interface/components/BackgroundSelector.css diff --git a/interface/src/components/BackgroundSelector.tsx b/interface/components/BackgroundSelector.tsx similarity index 100% rename from interface/src/components/BackgroundSelector.tsx rename to interface/components/BackgroundSelector.tsx diff --git a/interface/src/components/Picker.css b/interface/components/Picker.css similarity index 100% rename from interface/src/components/Picker.css rename to interface/components/Picker.css diff --git a/interface/src/components/Picker.tsx b/interface/components/Picker.tsx similarity index 100% rename from interface/src/components/Picker.tsx rename to interface/components/Picker.tsx diff --git a/interface/src/components/PickerSwatch.tsx b/interface/components/PickerSwatch.tsx similarity index 100% rename from interface/src/components/PickerSwatch.tsx rename to interface/components/PickerSwatch.tsx diff --git a/interface/src/components/Slider.css b/interface/components/Slider.css similarity index 100% rename from interface/src/components/Slider.css rename to interface/components/Slider.css diff --git a/interface/src/components/Slider.tsx b/interface/components/Slider.tsx similarity index 100% rename from interface/src/components/Slider.tsx rename to interface/components/Slider.tsx diff --git a/interface/src/components/Switch.css b/interface/components/Switch.css similarity index 100% rename from interface/src/components/Switch.css rename to interface/components/Switch.css diff --git a/interface/src/components/Switch.tsx b/interface/components/Switch.tsx similarity index 100% rename from interface/src/components/Switch.tsx rename to interface/components/Switch.tsx diff --git a/interface/src/components/TabbedContainer.tsx b/interface/components/TabbedContainer.tsx similarity index 100% rename from interface/src/components/TabbedContainer.tsx rename to interface/components/TabbedContainer.tsx diff --git a/interface/src/components/ThemeSelector.tsx b/interface/components/ThemeSelector.tsx similarity index 100% rename from interface/src/components/ThemeSelector.tsx rename to interface/components/ThemeSelector.tsx diff --git a/interface/src/hooks/BackgroundDataLoader.tsx b/interface/hooks/BackgroundDataLoader.tsx similarity index 100% rename from interface/src/hooks/BackgroundDataLoader.tsx rename to interface/hooks/BackgroundDataLoader.tsx diff --git a/interface/src/hooks/ThemeManagment.tsx b/interface/hooks/ThemeManagment.tsx similarity index 100% rename from interface/src/hooks/ThemeManagment.tsx rename to interface/hooks/ThemeManagment.tsx diff --git a/interface/src/hooks/settingsState.ts b/interface/hooks/settingsState.ts similarity index 100% rename from interface/src/hooks/settingsState.ts rename to interface/hooks/settingsState.ts diff --git a/interface/src/index.css b/interface/index.css similarity index 100% rename from interface/src/index.css rename to interface/index.css diff --git a/interface/index.html b/interface/index.html index 3e18be74..9d2a4017 100644 --- a/interface/index.html +++ b/interface/index.html @@ -8,7 +8,7 @@
- + diff --git a/interface/src/main.d.ts b/interface/main.d.ts similarity index 100% rename from interface/src/main.d.ts rename to interface/main.d.ts diff --git a/interface/src/main.tsx b/interface/main.tsx similarity index 100% rename from interface/src/main.tsx rename to interface/main.tsx diff --git a/interface/package.json b/interface/package.json deleted file mode 100644 index 088910d4..00000000 --- a/interface/package.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "popup", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite build --watch", - "build": "tsc && vite build", - "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", - "preview": "vite preview" - }, - "dependencies": { - "@sentry/react": "^7.85.0", - "@sentry/vite-plugin": "^2.10.2", - "@types/chrome": "^0.0.246", - "@types/webextension-polyfill": "^0.10.7", - "framer-motion": "^10.16.4", - "react": "^18.2.0", - "react-best-gradient-color-picker": "2.2.24", - "react-dom": "^18.2.0", - "react-router-dom": "latest", - "tinycolor2": "^1.6.0", - "webextension-polyfill": "^0.10.0" - }, - "devDependencies": { - "@types/react": "^18.2.15", - "@types/react-dom": "^18.2.7", - "@typescript-eslint/eslint-plugin": "^6.0.0", - "@typescript-eslint/parser": "^6.0.0", - "@vitejs/plugin-react": "^4.0.3", - "autoprefixer": "^10.4.15", - "eslint": "^8.45.0", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.4.3", - "postcss": "^8.4.29", - "tailwindcss": "^3.3.3", - "typescript": "^5.0.2", - "vite": "^4.4.5" - } -} diff --git a/interface/src/pages/About.tsx b/interface/pages/About.tsx similarity index 100% rename from interface/src/pages/About.tsx rename to interface/pages/About.tsx diff --git a/interface/src/pages/Settings.tsx b/interface/pages/Settings.tsx similarity index 100% rename from interface/src/pages/Settings.tsx rename to interface/pages/Settings.tsx diff --git a/interface/src/pages/Shortcuts.tsx b/interface/pages/Shortcuts.tsx similarity index 100% rename from interface/src/pages/Shortcuts.tsx rename to interface/pages/Shortcuts.tsx diff --git a/interface/src/pages/Themes.tsx b/interface/pages/Themes.tsx similarity index 100% rename from interface/src/pages/Themes.tsx rename to interface/pages/Themes.tsx diff --git a/interface/pnpm-lock.yaml b/interface/pnpm-lock.yaml deleted file mode 100644 index fa5c0952..00000000 --- a/interface/pnpm-lock.yaml +++ /dev/null @@ -1,2611 +0,0 @@ -lockfileVersion: '6.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -dependencies: - '@sentry/react': - specifier: ^7.85.0 - version: 7.85.0(react@18.2.0) - '@sentry/vite-plugin': - specifier: ^2.10.2 - version: 2.10.2 - '@types/chrome': - specifier: ^0.0.246 - version: 0.0.246 - '@types/webextension-polyfill': - specifier: ^0.10.7 - version: 0.10.7 - framer-motion: - specifier: ^10.16.4 - version: 10.16.12(react-dom@18.2.0)(react@18.2.0) - react: - specifier: ^18.2.0 - version: 18.2.0 - react-best-gradient-color-picker: - specifier: 2.2.24 - version: 2.2.24(react-dom@18.2.0)(react@18.2.0) - react-dom: - specifier: ^18.2.0 - version: 18.2.0(react@18.2.0) - react-router-dom: - specifier: latest - version: 6.20.1(react-dom@18.2.0)(react@18.2.0) - tinycolor2: - specifier: ^1.6.0 - version: 1.6.0 - webextension-polyfill: - specifier: ^0.10.0 - version: 0.10.0 - -devDependencies: - '@types/react': - specifier: ^18.2.15 - version: 18.2.40 - '@types/react-dom': - specifier: ^18.2.7 - version: 18.2.17 - '@typescript-eslint/eslint-plugin': - specifier: ^6.0.0 - version: 6.13.1(@typescript-eslint/parser@6.13.1)(eslint@8.55.0)(typescript@5.3.2) - '@typescript-eslint/parser': - specifier: ^6.0.0 - version: 6.13.1(eslint@8.55.0)(typescript@5.3.2) - '@vitejs/plugin-react': - specifier: ^4.0.3 - version: 4.2.0(vite@4.5.0) - autoprefixer: - specifier: ^10.4.15 - version: 10.4.16(postcss@8.4.32) - eslint: - specifier: ^8.45.0 - version: 8.55.0 - eslint-plugin-react-hooks: - specifier: ^4.6.0 - version: 4.6.0(eslint@8.55.0) - eslint-plugin-react-refresh: - specifier: ^0.4.3 - version: 0.4.4(eslint@8.55.0) - postcss: - specifier: ^8.4.29 - version: 8.4.32 - tailwindcss: - specifier: ^3.3.3 - version: 3.3.5 - typescript: - specifier: ^5.0.2 - version: 5.3.2 - vite: - specifier: ^4.4.5 - version: 4.5.0 - -packages: - - /@aashutoshrathi/word-wrap@1.2.6: - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - dev: true - - /@alloc/quick-lru@5.2.0: - resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} - engines: {node: '>=10'} - dev: true - - /@ampproject/remapping@2.2.1: - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.20 - dev: true - - /@babel/code-frame@7.23.5: - resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.23.4 - chalk: 2.4.2 - dev: true - - /@babel/compat-data@7.23.5: - resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/core@7.23.5: - resolution: {integrity: sha512-Cwc2XjUrG4ilcfOw4wBAK+enbdgwAcAJCfGUItPBKR7Mjw4aEfAFYrLxeRp4jWgtNIKn3n2AlBOfwwafl+42/g==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.5 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.5) - '@babel/helpers': 7.23.5 - '@babel/parser': 7.23.5 - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.5 - '@babel/types': 7.23.5 - convert-source-map: 2.0.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/generator@7.23.5: - resolution: {integrity: sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.5 - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.20 - jsesc: 2.5.2 - dev: true - - /@babel/helper-compilation-targets@7.22.15: - resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/compat-data': 7.23.5 - '@babel/helper-validator-option': 7.23.5 - browserslist: 4.22.1 - lru-cache: 5.1.1 - semver: 6.3.1 - dev: true - - /@babel/helper-environment-visitor@7.22.20: - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-function-name@7.23.0: - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.23.5 - dev: true - - /@babel/helper-hoist-variables@7.22.5: - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.5 - dev: true - - /@babel/helper-module-imports@7.22.15: - resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.5 - dev: true - - /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.5): - resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 - dev: true - - /@babel/helper-plugin-utils@7.22.5: - resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-simple-access@7.22.5: - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.5 - dev: true - - /@babel/helper-split-export-declaration@7.22.6: - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.5 - dev: true - - /@babel/helper-string-parser@7.23.4: - resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-validator-identifier@7.22.20: - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-validator-option@7.23.5: - resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helpers@7.23.5: - resolution: {integrity: sha512-oO7us8FzTEsG3U6ag9MfdF1iA/7Z6dz+MtFhifZk8C8o453rGJFFWUP1t+ULM9TUIAzC9uxXEiXjOiVMyd7QPg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.5 - '@babel/types': 7.23.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/highlight@7.23.4: - resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.22.20 - chalk: 2.4.2 - js-tokens: 4.0.0 - dev: true - - /@babel/parser@7.23.5: - resolution: {integrity: sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.23.5 - dev: true - - /@babel/plugin-transform-react-jsx-self@7.23.3(@babel/core@7.23.5): - resolution: {integrity: sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-transform-react-jsx-source@7.23.3(@babel/core@7.23.5): - resolution: {integrity: sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.5 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/template@7.22.15: - resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.23.5 - '@babel/parser': 7.23.5 - '@babel/types': 7.23.5 - dev: true - - /@babel/traverse@7.23.5: - resolution: {integrity: sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.23.5 - '@babel/generator': 7.23.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.23.5 - '@babel/types': 7.23.5 - debug: 4.3.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/types@7.23.5: - resolution: {integrity: sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.23.4 - '@babel/helper-validator-identifier': 7.22.20 - to-fast-properties: 2.0.0 - dev: true - - /@emotion/is-prop-valid@0.8.8: - resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} - requiresBuild: true - dependencies: - '@emotion/memoize': 0.7.4 - dev: false - optional: true - - /@emotion/memoize@0.7.4: - resolution: {integrity: sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==} - requiresBuild: true - dev: false - optional: true - - /@esbuild/android-arm64@0.18.20: - resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm@0.18.20: - resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-x64@0.18.20: - resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-arm64@0.18.20: - resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-x64@0.18.20: - resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-arm64@0.18.20: - resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-x64@0.18.20: - resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm64@0.18.20: - resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm@0.18.20: - resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ia32@0.18.20: - resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-loong64@0.18.20: - resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-mips64el@0.18.20: - resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ppc64@0.18.20: - resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-riscv64@0.18.20: - resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-s390x@0.18.20: - resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-x64@0.18.20: - resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/netbsd-x64@0.18.20: - resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/openbsd-x64@0.18.20: - resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/sunos-x64@0.18.20: - resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-arm64@0.18.20: - resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-ia32@0.18.20: - resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-x64@0.18.20: - resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@eslint-community/eslint-utils@4.4.0(eslint@8.55.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.55.0 - eslint-visitor-keys: 3.4.3 - dev: true - - /@eslint-community/regexpp@4.10.0: - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true - - /@eslint/eslintrc@2.1.4: - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.6.1 - globals: 13.23.0 - ignore: 5.3.0 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@eslint/js@8.55.0: - resolution: {integrity: sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /@humanwhocodes/config-array@0.11.13: - resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} - engines: {node: '>=10.10.0'} - dependencies: - '@humanwhocodes/object-schema': 2.0.1 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - dev: true - - /@humanwhocodes/object-schema@2.0.1: - resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} - dev: true - - /@jridgewell/gen-mapping@0.3.3: - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.20 - dev: true - - /@jridgewell/resolve-uri@3.1.1: - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} - engines: {node: '>=6.0.0'} - dev: true - - /@jridgewell/set-array@1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} - engines: {node: '>=6.0.0'} - dev: true - - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - - /@jridgewell/trace-mapping@0.3.20: - resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} - dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - dev: true - - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - dev: true - - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 - dev: true - - /@remix-run/router@1.13.1: - resolution: {integrity: sha512-so+DHzZKsoOcoXrILB4rqDkMDy7NLMErRdOxvzvOKb507YINKUP4Di+shbTZDhSE/pBZ+vr7XGIpcOO0VLSA+Q==} - engines: {node: '>=14.0.0'} - dev: false - - /@sentry-internal/feedback@7.85.0: - resolution: {integrity: sha512-MlbIN+N8CWFJBjbqMmARe4+UPo9QRhRar0YoOfmNA2Xqk/EwXcjHWkealosHznXH7tqVbjB25QJpHtDystft/Q==} - engines: {node: '>=12'} - dependencies: - '@sentry/core': 7.85.0 - '@sentry/types': 7.85.0 - '@sentry/utils': 7.85.0 - dev: false - - /@sentry-internal/tracing@7.85.0: - resolution: {integrity: sha512-p3YMUwkPCy2su9cm/3+7QYR4RiMI0+07DU1BZtht9NLTzY2O87/yvUbn1v2yHR3vJQTy/+7N0ud9/mPBFznRQQ==} - engines: {node: '>=8'} - dependencies: - '@sentry/core': 7.85.0 - '@sentry/types': 7.85.0 - '@sentry/utils': 7.85.0 - dev: false - - /@sentry/browser@7.85.0: - resolution: {integrity: sha512-x4sH7vTQnZQgy1U7NuN8XwhleAw7YMQitccHeC5m+kpIKGUO7w4Mdvu8rD3dnjmVmZvASpnwocAxy57/vCU6Ww==} - engines: {node: '>=8'} - dependencies: - '@sentry-internal/feedback': 7.85.0 - '@sentry-internal/tracing': 7.85.0 - '@sentry/core': 7.85.0 - '@sentry/replay': 7.85.0 - '@sentry/types': 7.85.0 - '@sentry/utils': 7.85.0 - dev: false - - /@sentry/bundler-plugin-core@2.10.2: - resolution: {integrity: sha512-7IoekLtROlJZqTxtHQ3IhocBuf9dsEq+JjqlHMyZXoq+QKuvJFvMd/4T+r6KjZ15kMZOIkR+spK3V7duH201hw==} - engines: {node: '>= 14'} - dependencies: - '@sentry/cli': 2.22.3 - '@sentry/node': 7.85.0 - '@sentry/utils': 7.85.0 - dotenv: 16.3.1 - find-up: 5.0.0 - glob: 9.3.2 - magic-string: 0.27.0 - unplugin: 1.0.1 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /@sentry/cli-darwin@2.22.3: - resolution: {integrity: sha512-A1DwFTffg3+fF68qujaJI07dk/1H1pRuihlvS5WQ9sD7nQLnXZGoLUht4eULixhDzZYinWHKkcWzQ6k40UTvNA==} - engines: {node: '>=10'} - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@sentry/cli-linux-arm64@2.22.3: - resolution: {integrity: sha512-PnBPb4LJ+A2LlqLjtVFn4mEizcVdxBSLZvB85pEGzq9DRXjZ6ZEuGWFHTVnWvjd79TB/s0me29QnLc3n4B6lgA==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux, freebsd] - requiresBuild: true - dev: false - optional: true - - /@sentry/cli-linux-arm@2.22.3: - resolution: {integrity: sha512-mDtLVbqbCu/5b/v2quTAMzY/atGlJVvrqO2Wvpro0Jb/LYhn7Y1pVBdoXEDcnOX82/pseFkLT8PFfq/OcezPhA==} - engines: {node: '>=10'} - cpu: [arm] - os: [linux, freebsd] - requiresBuild: true - dev: false - optional: true - - /@sentry/cli-linux-i686@2.22.3: - resolution: {integrity: sha512-wxvbpQ2hiw4hwJWfJMp7K45BV40nXL62f91jLuftFXIbieKX1Li57NNKNu2JUVn7W1bJxkwz/PKGGTXSgeJlRw==} - engines: {node: '>=10'} - cpu: [x86, ia32] - os: [linux, freebsd] - requiresBuild: true - dev: false - optional: true - - /@sentry/cli-linux-x64@2.22.3: - resolution: {integrity: sha512-0GxsYNO5GyRWifeOpng+MmdUFZRA64bgA1n1prsEsXnoeLcm3Zj4Q63hBZmiwz9Qbhf5ibohkpf94a7dI7pv3A==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux, freebsd] - requiresBuild: true - dev: false - optional: true - - /@sentry/cli-win32-i686@2.22.3: - resolution: {integrity: sha512-YERPsd7ClBrxKcmCUw+ZrAvQfbyIZFrqh269hgDuXFodpsB7LPGnI33ilo0uzmKdq2vGppTb6Z3gf1Rbq0Hadg==} - engines: {node: '>=10'} - cpu: [x86, ia32] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@sentry/cli-win32-x64@2.22.3: - resolution: {integrity: sha512-NUh56xWvgJo2KuC9lI6o6nTPXdzbpQUB4qGwJ73L9NP3HT2P1I27jtHyrC2zlXTVlYE23gQZGrL3wgW4Jy80QA==} - engines: {node: '>=10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@sentry/cli@2.22.3: - resolution: {integrity: sha512-VFHdtrHsMyTRSZhDLeMyXvit7xB4e81KugIEwMve95c7h5HO672bfmCcM/403CAugj4NzvQ+IR2NKF/2SsEPlg==} - engines: {node: '>= 10'} - hasBin: true - dependencies: - https-proxy-agent: 5.0.1 - node-fetch: 2.7.0 - progress: 2.0.3 - proxy-from-env: 1.1.0 - which: 2.0.2 - optionalDependencies: - '@sentry/cli-darwin': 2.22.3 - '@sentry/cli-linux-arm': 2.22.3 - '@sentry/cli-linux-arm64': 2.22.3 - '@sentry/cli-linux-i686': 2.22.3 - '@sentry/cli-linux-x64': 2.22.3 - '@sentry/cli-win32-i686': 2.22.3 - '@sentry/cli-win32-x64': 2.22.3 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /@sentry/core@7.85.0: - resolution: {integrity: sha512-DFDAc4tWmHN5IWhr7XbHCiyF1Xgb95jz8Uj/JTX9atlgodId1UIbER77qpEmH3eQGid/QBdqrlR98zCixgSbwg==} - engines: {node: '>=8'} - dependencies: - '@sentry/types': 7.85.0 - '@sentry/utils': 7.85.0 - dev: false - - /@sentry/node@7.85.0: - resolution: {integrity: sha512-uiBtRW9G017NHoCXBlK3ttkTwHXLFyI8ndHpaObtyajKTv3ptGIThVEn7DuK7Pwor//RjwjSEEOa7WDK+FdMVQ==} - engines: {node: '>=8'} - dependencies: - '@sentry-internal/tracing': 7.85.0 - '@sentry/core': 7.85.0 - '@sentry/types': 7.85.0 - '@sentry/utils': 7.85.0 - https-proxy-agent: 5.0.1 - transitivePeerDependencies: - - supports-color - dev: false - - /@sentry/react@7.85.0(react@18.2.0): - resolution: {integrity: sha512-digw63l1A9n+74rW8uiG575Xh3qWTkmvwgTfNRFvDokDRMqRTP0iQEqZRBrBEzMZ5JUa6s+5NLc1/dbMh1QQgA==} - engines: {node: '>=8'} - peerDependencies: - react: 15.x || 16.x || 17.x || 18.x - dependencies: - '@sentry/browser': 7.85.0 - '@sentry/types': 7.85.0 - '@sentry/utils': 7.85.0 - hoist-non-react-statics: 3.3.2 - react: 18.2.0 - dev: false - - /@sentry/replay@7.85.0: - resolution: {integrity: sha512-zVtTKfO+lu5qTwHpETI/oGo8hU3rdKHr3CdI1vRLw+d60PcAa/pWVlXsQeLRTw8PFwE358gHcpFZezj/11afew==} - engines: {node: '>=12'} - dependencies: - '@sentry-internal/tracing': 7.85.0 - '@sentry/core': 7.85.0 - '@sentry/types': 7.85.0 - '@sentry/utils': 7.85.0 - dev: false - - /@sentry/types@7.85.0: - resolution: {integrity: sha512-R5jR4XkK5tBU2jDiPdSVqzkmjYRr666bcGaFGUHB/xDQCjPsjk+pEmCCL+vpuWoaZmQJUE1hVU7rgnVX81w8zg==} - engines: {node: '>=8'} - dev: false - - /@sentry/utils@7.85.0: - resolution: {integrity: sha512-JZ7seNOLvhjAQ8GeB3GYknPQJkuhF88xAYOaESZP3xPOWBMFUN+IO4RqjMqMLFDniOwsVQS7GB/MfP+hxufieg==} - engines: {node: '>=8'} - dependencies: - '@sentry/types': 7.85.0 - dev: false - - /@sentry/vite-plugin@2.10.2: - resolution: {integrity: sha512-30uu0L8ZCpAKOxAXmtyqwL06sG8UEBXGY5mxUDITyQYDf8pKuiOEf5018KlEDjhYVypfMQH3jq5xXUUka+/ipg==} - engines: {node: '>= 14'} - dependencies: - '@sentry/bundler-plugin-core': 2.10.2 - unplugin: 1.0.1 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /@types/babel__core@7.20.5: - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - dependencies: - '@babel/parser': 7.23.5 - '@babel/types': 7.23.5 - '@types/babel__generator': 7.6.7 - '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.4 - dev: true - - /@types/babel__generator@7.6.7: - resolution: {integrity: sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==} - dependencies: - '@babel/types': 7.23.5 - dev: true - - /@types/babel__template@7.4.4: - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - dependencies: - '@babel/parser': 7.23.5 - '@babel/types': 7.23.5 - dev: true - - /@types/babel__traverse@7.20.4: - resolution: {integrity: sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==} - dependencies: - '@babel/types': 7.23.5 - dev: true - - /@types/chrome@0.0.246: - resolution: {integrity: sha512-MxGxEomGxsJiL9xe/7ZwVgwdn8XVKWbPvxpVQl3nWOjrS0Ce63JsfzxUc4aU3GvRcUPYsfufHmJ17BFyKxeA4g==} - dependencies: - '@types/filesystem': 0.0.35 - '@types/har-format': 1.2.15 - dev: false - - /@types/filesystem@0.0.35: - resolution: {integrity: sha512-1eKvCaIBdrD2mmMgy5dwh564rVvfEhZTWVQQGRNn0Nt4ZEnJ0C8oSUCzvMKRA4lGde5oEVo+q2MrTTbV/GHDCQ==} - dependencies: - '@types/filewriter': 0.0.32 - dev: false - - /@types/filewriter@0.0.32: - resolution: {integrity: sha512-Kpi2GXQyYJdjL8mFclL1eDgihn1SIzorMZjD94kdPZh9E4VxGOeyjPxi5LpsM4Zku7P0reqegZTt2GxhmA9VBg==} - dev: false - - /@types/har-format@1.2.15: - resolution: {integrity: sha512-RpQH4rXLuvTXKR0zqHq3go0RVXYv/YVqv4TnPH95VbwUxZdQlK1EtcMvQvMpDngHbt13Csh9Z4qT9AbkiQH5BA==} - dev: false - - /@types/json-schema@7.0.15: - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - dev: true - - /@types/prop-types@15.7.11: - resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} - dev: true - - /@types/react-dom@18.2.17: - resolution: {integrity: sha512-rvrT/M7Df5eykWFxn6MYt5Pem/Dbyc1N8Y0S9Mrkw2WFCRiqUgw9P7ul2NpwsXCSM1DVdENzdG9J5SreqfAIWg==} - dependencies: - '@types/react': 18.2.40 - dev: true - - /@types/react@18.2.40: - resolution: {integrity: sha512-H+BUhb9C1zBtogDLAk+KCNRKiHDrqSwQT/0z0PVTwMFBxqg3011ByLomADtgkgMkfwj4AMOiXBReyLTUBg681g==} - dependencies: - '@types/prop-types': 15.7.11 - '@types/scheduler': 0.16.8 - csstype: 3.1.2 - dev: true - - /@types/scheduler@0.16.8: - resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} - dev: true - - /@types/semver@7.5.6: - resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} - dev: true - - /@types/webextension-polyfill@0.10.7: - resolution: {integrity: sha512-10ql7A0qzBmFB+F+qAke/nP1PIonS0TXZAOMVOxEUsm+lGSW6uwVcISFNa0I4Oyj0884TZVWGGMIWeXOVSNFHw==} - dev: false - - /@typescript-eslint/eslint-plugin@6.13.1(@typescript-eslint/parser@6.13.1)(eslint@8.55.0)(typescript@5.3.2): - resolution: {integrity: sha512-5bQDGkXaxD46bPvQt08BUz9YSaO4S0fB1LB5JHQuXTfkGPI3+UUeS387C/e9jRie5GqT8u5kFTrMvAjtX4O5kA==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 6.13.1(eslint@8.55.0)(typescript@5.3.2) - '@typescript-eslint/scope-manager': 6.13.1 - '@typescript-eslint/type-utils': 6.13.1(eslint@8.55.0)(typescript@5.3.2) - '@typescript-eslint/utils': 6.13.1(eslint@8.55.0)(typescript@5.3.2) - '@typescript-eslint/visitor-keys': 6.13.1 - debug: 4.3.4 - eslint: 8.55.0 - graphemer: 1.4.0 - ignore: 5.3.0 - natural-compare: 1.4.0 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.3.2) - typescript: 5.3.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/parser@6.13.1(eslint@8.55.0)(typescript@5.3.2): - resolution: {integrity: sha512-fs2XOhWCzRhqMmQf0eicLa/CWSaYss2feXsy7xBD/pLyWke/jCIVc2s1ikEAtSW7ina1HNhv7kONoEfVNEcdDQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 6.13.1 - '@typescript-eslint/types': 6.13.1 - '@typescript-eslint/typescript-estree': 6.13.1(typescript@5.3.2) - '@typescript-eslint/visitor-keys': 6.13.1 - debug: 4.3.4 - eslint: 8.55.0 - typescript: 5.3.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/scope-manager@6.13.1: - resolution: {integrity: sha512-BW0kJ7ceiKi56GbT2KKzZzN+nDxzQK2DS6x0PiSMPjciPgd/JRQGMibyaN2cPt2cAvuoH0oNvn2fwonHI+4QUQ==} - engines: {node: ^16.0.0 || >=18.0.0} - dependencies: - '@typescript-eslint/types': 6.13.1 - '@typescript-eslint/visitor-keys': 6.13.1 - dev: true - - /@typescript-eslint/type-utils@6.13.1(eslint@8.55.0)(typescript@5.3.2): - resolution: {integrity: sha512-A2qPlgpxx2v//3meMqQyB1qqTg1h1dJvzca7TugM3Yc2USDY+fsRBiojAEo92HO7f5hW5mjAUF6qobOPzlBCBQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/typescript-estree': 6.13.1(typescript@5.3.2) - '@typescript-eslint/utils': 6.13.1(eslint@8.55.0)(typescript@5.3.2) - debug: 4.3.4 - eslint: 8.55.0 - ts-api-utils: 1.0.3(typescript@5.3.2) - typescript: 5.3.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/types@6.13.1: - resolution: {integrity: sha512-gjeEskSmiEKKFIbnhDXUyiqVma1gRCQNbVZ1C8q7Zjcxh3WZMbzWVfGE9rHfWd1msQtPS0BVD9Jz9jded44eKg==} - engines: {node: ^16.0.0 || >=18.0.0} - dev: true - - /@typescript-eslint/typescript-estree@6.13.1(typescript@5.3.2): - resolution: {integrity: sha512-sBLQsvOC0Q7LGcUHO5qpG1HxRgePbT6wwqOiGLpR8uOJvPJbfs0mW3jPA3ujsDvfiVwVlWUDESNXv44KtINkUQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 6.13.1 - '@typescript-eslint/visitor-keys': 6.13.1 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.3.2) - typescript: 5.3.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/utils@6.13.1(eslint@8.55.0)(typescript@5.3.2): - resolution: {integrity: sha512-ouPn/zVoan92JgAegesTXDB/oUp6BP1v8WpfYcqh649ejNc9Qv+B4FF2Ff626kO1xg0wWwwG48lAJ4JuesgdOw==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.55.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.6 - '@typescript-eslint/scope-manager': 6.13.1 - '@typescript-eslint/types': 6.13.1 - '@typescript-eslint/typescript-estree': 6.13.1(typescript@5.3.2) - eslint: 8.55.0 - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /@typescript-eslint/visitor-keys@6.13.1: - resolution: {integrity: sha512-NDhQUy2tg6XGNBGDRm1XybOHSia8mcXmlbKWoQP+nm1BIIMxa55shyJfZkHpEBN62KNPLrocSM2PdPcaLgDKMQ==} - engines: {node: ^16.0.0 || >=18.0.0} - dependencies: - '@typescript-eslint/types': 6.13.1 - eslint-visitor-keys: 3.4.3 - dev: true - - /@ungap/structured-clone@1.2.0: - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - dev: true - - /@vitejs/plugin-react@4.2.0(vite@4.5.0): - resolution: {integrity: sha512-+MHTH/e6H12kRp5HUkzOGqPMksezRMmW+TNzlh/QXfI8rRf6l2Z2yH/v12no1UvTwhZgEDMuQ7g7rrfMseU6FQ==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - vite: ^4.2.0 || ^5.0.0 - dependencies: - '@babel/core': 7.23.5 - '@babel/plugin-transform-react-jsx-self': 7.23.3(@babel/core@7.23.5) - '@babel/plugin-transform-react-jsx-source': 7.23.3(@babel/core@7.23.5) - '@types/babel__core': 7.20.5 - react-refresh: 0.14.0 - vite: 4.5.0 - transitivePeerDependencies: - - supports-color - dev: true - - /acorn-jsx@5.3.2(acorn@8.11.2): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.11.2 - dev: true - - /acorn@8.11.2: - resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} - engines: {node: '>=0.4.0'} - hasBin: true - - /agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - dependencies: - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: false - - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - dev: true - - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - dev: true - - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - dependencies: - color-convert: 1.9.3 - dev: true - - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - dev: true - - /any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - dev: true - - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - /arg@5.0.2: - resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - dev: true - - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true - - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: true - - /autoprefixer@10.4.16(postcss@8.4.32): - resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 - dependencies: - browserslist: 4.22.1 - caniuse-lite: 1.0.30001565 - fraction.js: 4.3.7 - normalize-range: 0.1.2 - picocolors: 1.0.0 - postcss: 8.4.32 - postcss-value-parser: 4.2.0 - dev: true - - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - /base64-arraybuffer@1.0.2: - resolution: {integrity: sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==} - engines: {node: '>= 0.6.0'} - dev: false - - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - dev: true - - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - dependencies: - balanced-match: 1.0.2 - dev: false - - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - - /browserslist@4.22.1: - resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - caniuse-lite: 1.0.30001565 - electron-to-chromium: 1.4.601 - node-releases: 2.0.14 - update-browserslist-db: 1.0.13(browserslist@4.22.1) - dev: true - - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - dev: true - - /camelcase-css@2.0.1: - resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} - engines: {node: '>= 6'} - dev: true - - /caniuse-lite@1.0.30001565: - resolution: {integrity: sha512-xrE//a3O7TP0vaJ8ikzkD2c2NgcVUvsEe2IvFTntV4Yd1Z9FVzh+gW+enX96L0psrbaFMcVcH2l90xNuGDWc8w==} - dev: true - - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - dev: true - - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true - - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - dependencies: - color-name: 1.1.3 - dev: true - - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - dev: true - - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: true - - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: true - - /commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - dev: true - - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: true - - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - dev: true - - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - dev: true - - /css-line-break@2.1.0: - resolution: {integrity: sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==} - dependencies: - utrie: 1.0.2 - dev: false - - /cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /csstype@3.1.2: - resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} - dev: true - - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true - - /didyoumean@1.2.2: - resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - dev: true - - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dependencies: - path-type: 4.0.0 - dev: true - - /dlv@1.1.3: - resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - dev: true - - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dependencies: - esutils: 2.0.3 - dev: true - - /dotenv@16.3.1: - resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} - engines: {node: '>=12'} - dev: false - - /electron-to-chromium@1.4.601: - resolution: {integrity: sha512-SpwUMDWe9tQu8JX5QCO1+p/hChAi9AE9UpoC3rcHVc+gdCGlbT3SGb5I1klgb952HRIyvt9wZhSz9bNBYz9swA==} - dev: true - - /esbuild@0.18.20: - resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.18.20 - '@esbuild/android-arm64': 0.18.20 - '@esbuild/android-x64': 0.18.20 - '@esbuild/darwin-arm64': 0.18.20 - '@esbuild/darwin-x64': 0.18.20 - '@esbuild/freebsd-arm64': 0.18.20 - '@esbuild/freebsd-x64': 0.18.20 - '@esbuild/linux-arm': 0.18.20 - '@esbuild/linux-arm64': 0.18.20 - '@esbuild/linux-ia32': 0.18.20 - '@esbuild/linux-loong64': 0.18.20 - '@esbuild/linux-mips64el': 0.18.20 - '@esbuild/linux-ppc64': 0.18.20 - '@esbuild/linux-riscv64': 0.18.20 - '@esbuild/linux-s390x': 0.18.20 - '@esbuild/linux-x64': 0.18.20 - '@esbuild/netbsd-x64': 0.18.20 - '@esbuild/openbsd-x64': 0.18.20 - '@esbuild/sunos-x64': 0.18.20 - '@esbuild/win32-arm64': 0.18.20 - '@esbuild/win32-ia32': 0.18.20 - '@esbuild/win32-x64': 0.18.20 - dev: true - - /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - dev: true - - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - dev: true - - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - dev: true - - /eslint-plugin-react-hooks@4.6.0(eslint@8.55.0): - resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - dependencies: - eslint: 8.55.0 - dev: true - - /eslint-plugin-react-refresh@0.4.4(eslint@8.55.0): - resolution: {integrity: sha512-eD83+65e8YPVg6603Om2iCIwcQJf/y7++MWm4tACtEswFLYMwxwVWAfwN+e19f5Ad/FOyyNg9Dfi5lXhH3Y3rA==} - peerDependencies: - eslint: '>=7' - dependencies: - eslint: 8.55.0 - dev: true - - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - dev: true - - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /eslint@8.55.0: - resolution: {integrity: sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.55.0) - '@eslint-community/regexpp': 4.10.0 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.55.0 - '@humanwhocodes/config-array': 0.11.13 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.23.0 - graphemer: 1.4.0 - ignore: 5.3.0 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.3 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - dev: true - - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - acorn: 8.11.2 - acorn-jsx: 5.3.2(acorn@8.11.2) - eslint-visitor-keys: 3.4.3 - dev: true - - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} - dependencies: - estraverse: 5.3.0 - dev: true - - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - dependencies: - estraverse: 5.3.0 - dev: true - - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - dev: true - - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: true - - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: true - - /fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: true - - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true - - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true - - /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} - dependencies: - reusify: 1.0.4 - dev: true - - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flat-cache: 3.2.0 - dev: true - - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - /flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flatted: 3.2.9 - keyv: 4.5.4 - rimraf: 3.0.2 - dev: true - - /flatted@3.2.9: - resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} - dev: true - - /fraction.js@4.3.7: - resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - dev: true - - /framer-motion@10.16.12(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-w7Yzx0OzQ5Uh6uNkxaX+4TuAPuOKz3haSbjmHpdrqDpGuCJCpq6YP9Dy7JJWdZ6mJjndrg3Ao3vUwDajKNikCA==} - peerDependencies: - react: ^18.0.0 - react-dom: ^18.0.0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - dependencies: - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - tslib: 2.6.2 - optionalDependencies: - '@emotion/is-prop-valid': 0.8.8 - dev: false - - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - optional: true - - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - dev: true - - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - dev: true - - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 - - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - dependencies: - is-glob: 4.0.3 - dev: true - - /glob@7.1.6: - resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - - /glob@9.3.2: - resolution: {integrity: sha512-BTv/JhKXFEHsErMte/AnfiSv8yYOLLiyH2lTg8vn02O21zWFgHPTfxtgn1QRe7NRgggUhC8hacR2Re94svHqeA==} - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - fs.realpath: 1.0.0 - minimatch: 7.4.6 - minipass: 4.2.8 - path-scurry: 1.10.1 - dev: false - - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - dev: true - - /globals@13.23.0: - resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.20.2 - dev: true - - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.0 - merge2: 1.4.1 - slash: 3.0.0 - dev: true - - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: true - - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - dev: true - - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - dev: true - - /hasown@2.0.0: - resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} - engines: {node: '>= 0.4'} - dependencies: - function-bind: 1.1.2 - dev: true - - /hoist-non-react-statics@3.3.2: - resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} - dependencies: - react-is: 16.13.1 - dev: false - - /html2canvas@1.4.1: - resolution: {integrity: sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA==} - engines: {node: '>=8.0.0'} - dependencies: - css-line-break: 2.1.0 - text-segmentation: 1.0.3 - dev: false - - /https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - dependencies: - agent-base: 6.0.2 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: false - - /ignore@5.3.0: - resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} - engines: {node: '>= 4'} - dev: true - - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - dev: true - - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: true - - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - dev: true - - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: true - - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - dependencies: - binary-extensions: 2.2.0 - - /is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} - dependencies: - hasown: 2.0.0 - dev: true - - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - dev: true - - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - /jiti@1.21.0: - resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} - hasBin: true - dev: true - - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - dependencies: - argparse: 2.0.1 - dev: true - - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: true - - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true - - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true - - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - dev: true - - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - dependencies: - json-buffer: 3.0.1 - dev: true - - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - dev: true - - /lilconfig@2.1.0: - resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} - engines: {node: '>=10'} - dev: true - - /lilconfig@3.0.0: - resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} - engines: {node: '>=14'} - dev: true - - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: true - - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - dependencies: - p-locate: 5.0.0 - - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true - - /lodash.throttle@4.1.1: - resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} - dev: false - - /loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - dependencies: - js-tokens: 4.0.0 - dev: false - - /lru-cache@10.1.0: - resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} - engines: {node: 14 || >=16.14} - dev: false - - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - dependencies: - yallist: 3.1.1 - dev: true - - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - dev: true - - /magic-string@0.27.0: - resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} - engines: {node: '>=12'} - dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - dev: false - - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: true - - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - dev: true - - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.11 - dev: true - - /minimatch@7.4.6: - resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} - engines: {node: '>=10'} - dependencies: - brace-expansion: 2.0.1 - dev: false - - /minipass@4.2.8: - resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} - engines: {node: '>=8'} - dev: false - - /minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} - engines: {node: '>=16 || 14 >=14.17'} - dev: false - - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - /mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 - dev: true - - /nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: true - - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true - - /node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - dependencies: - whatwg-url: 5.0.0 - dev: false - - /node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} - dev: true - - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - /normalize-range@0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} - engines: {node: '>=0.10.0'} - dev: true - - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - dev: true - - /object-hash@3.0.0: - resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} - engines: {node: '>= 6'} - dev: true - - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 - dev: true - - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} - dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - dev: true - - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - dependencies: - yocto-queue: 0.1.0 - - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - dependencies: - p-limit: 3.1.0 - - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - dependencies: - callsites: 3.1.0 - dev: true - - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - dev: true - - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: true - - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true - - /path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - lru-cache: 10.1.0 - minipass: 7.0.4 - dev: false - - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: true - - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: true - - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - /pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - dev: true - - /pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} - dev: true - - /postcss-import@15.1.0(postcss@8.4.32): - resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} - engines: {node: '>=14.0.0'} - peerDependencies: - postcss: ^8.0.0 - dependencies: - postcss: 8.4.32 - postcss-value-parser: 4.2.0 - read-cache: 1.0.0 - resolve: 1.22.8 - dev: true - - /postcss-js@4.0.1(postcss@8.4.32): - resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} - engines: {node: ^12 || ^14 || >= 16} - peerDependencies: - postcss: ^8.4.21 - dependencies: - camelcase-css: 2.0.1 - postcss: 8.4.32 - dev: true - - /postcss-load-config@4.0.2(postcss@8.4.32): - resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} - engines: {node: '>= 14'} - peerDependencies: - postcss: '>=8.0.9' - ts-node: '>=9.0.0' - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true - dependencies: - lilconfig: 3.0.0 - postcss: 8.4.32 - yaml: 2.3.4 - dev: true - - /postcss-nested@6.0.1(postcss@8.4.32): - resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.2.14 - dependencies: - postcss: 8.4.32 - postcss-selector-parser: 6.0.13 - dev: true - - /postcss-selector-parser@6.0.13: - resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} - engines: {node: '>=4'} - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - dev: true - - /postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - dev: true - - /postcss@8.4.32: - resolution: {integrity: sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.0.2 - dev: true - - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: true - - /progress@2.0.3: - resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} - engines: {node: '>=0.4.0'} - dev: false - - /proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - dev: false - - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - dev: true - - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true - - /react-best-gradient-color-picker@2.2.24(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-7GsKDWHsELCnsGCS9eD8AKjWuqIrIfROZx3fzdGNdtsH5TfLof2CGZGoz3NPNusPcIoe2IPrjeCA4fUqAoUgEg==} - peerDependencies: - react: ^16.3.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.3.0 || ^17.0.0 || ^18.0.0 - dependencies: - html2canvas: 1.4.1 - lodash.throttle: 4.1.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - tinycolor2: 1.4.2 - dev: false - - /react-dom@18.2.0(react@18.2.0): - resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} - peerDependencies: - react: ^18.2.0 - dependencies: - loose-envify: 1.4.0 - react: 18.2.0 - scheduler: 0.23.0 - dev: false - - /react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - dev: false - - /react-refresh@0.14.0: - resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} - engines: {node: '>=0.10.0'} - dev: true - - /react-router-dom@6.20.1(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-npzfPWcxfQN35psS7rJgi/EW0Gx6EsNjfdJSAk73U/HqMEJZ2k/8puxfwHFgDQhBGmS3+sjnGbMdMSV45axPQw==} - engines: {node: '>=14.0.0'} - peerDependencies: - react: '>=16.8' - react-dom: '>=16.8' - dependencies: - '@remix-run/router': 1.13.1 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-router: 6.20.1(react@18.2.0) - dev: false - - /react-router@6.20.1(react@18.2.0): - resolution: {integrity: sha512-ccvLrB4QeT5DlaxSFFYi/KR8UMQ4fcD8zBcR71Zp1kaYTC5oJKYAp1cbavzGrogwxca+ubjkd7XjFZKBW8CxPA==} - engines: {node: '>=14.0.0'} - peerDependencies: - react: '>=16.8' - dependencies: - '@remix-run/router': 1.13.1 - react: 18.2.0 - dev: false - - /react@18.2.0: - resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} - engines: {node: '>=0.10.0'} - dependencies: - loose-envify: 1.4.0 - dev: false - - /read-cache@1.0.0: - resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} - dependencies: - pify: 2.3.0 - dev: true - - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - dependencies: - picomatch: 2.3.1 - - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - dev: true - - /resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true - dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: true - - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true - dependencies: - glob: 7.2.3 - dev: true - - /rollup@3.29.4: - resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} - hasBin: true - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - dependencies: - queue-microtask: 1.2.3 - dev: true - - /scheduler@0.23.0: - resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} - dependencies: - loose-envify: 1.4.0 - dev: false - - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - dev: true - - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - dev: true - - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: true - - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: true - - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} - engines: {node: '>=0.10.0'} - dev: true - - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - dev: true - - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - dev: true - - /sucrase@3.34.0: - resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==} - engines: {node: '>=8'} - hasBin: true - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - commander: 4.1.1 - glob: 7.1.6 - lines-and-columns: 1.2.4 - mz: 2.7.0 - pirates: 4.0.6 - ts-interface-checker: 0.1.13 - dev: true - - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - dependencies: - has-flag: 3.0.0 - dev: true - - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - dev: true - - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: true - - /tailwindcss@3.3.5: - resolution: {integrity: sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==} - engines: {node: '>=14.0.0'} - hasBin: true - dependencies: - '@alloc/quick-lru': 5.2.0 - arg: 5.0.2 - chokidar: 3.5.3 - didyoumean: 1.2.2 - dlv: 1.1.3 - fast-glob: 3.3.2 - glob-parent: 6.0.2 - is-glob: 4.0.3 - jiti: 1.21.0 - lilconfig: 2.1.0 - micromatch: 4.0.5 - normalize-path: 3.0.0 - object-hash: 3.0.0 - picocolors: 1.0.0 - postcss: 8.4.32 - postcss-import: 15.1.0(postcss@8.4.32) - postcss-js: 4.0.1(postcss@8.4.32) - postcss-load-config: 4.0.2(postcss@8.4.32) - postcss-nested: 6.0.1(postcss@8.4.32) - postcss-selector-parser: 6.0.13 - resolve: 1.22.8 - sucrase: 3.34.0 - transitivePeerDependencies: - - ts-node - dev: true - - /text-segmentation@1.0.3: - resolution: {integrity: sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==} - dependencies: - utrie: 1.0.2 - dev: false - - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true - - /thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} - dependencies: - thenify: 3.3.1 - dev: true - - /thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - dependencies: - any-promise: 1.3.0 - dev: true - - /tinycolor2@1.4.2: - resolution: {integrity: sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==} - dev: false - - /tinycolor2@1.6.0: - resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} - dev: false - - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - dev: true - - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - dependencies: - is-number: 7.0.0 - - /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - dev: false - - /ts-api-utils@1.0.3(typescript@5.3.2): - resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} - engines: {node: '>=16.13.0'} - peerDependencies: - typescript: '>=4.2.0' - dependencies: - typescript: 5.3.2 - dev: true - - /ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - dev: true - - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - dev: false - - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - dev: true - - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - dev: true - - /typescript@5.3.2: - resolution: {integrity: sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==} - engines: {node: '>=14.17'} - hasBin: true - dev: true - - /unplugin@1.0.1: - resolution: {integrity: sha512-aqrHaVBWW1JVKBHmGo33T5TxeL0qWzfvjWokObHA9bYmN7eNDkwOxmLjhioHl9878qDFMAaT51XNroRyuz7WxA==} - dependencies: - acorn: 8.11.2 - chokidar: 3.5.3 - webpack-sources: 3.2.3 - webpack-virtual-modules: 0.5.0 - dev: false - - /update-browserslist-db@1.0.13(browserslist@4.22.1): - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - dependencies: - browserslist: 4.22.1 - escalade: 3.1.1 - picocolors: 1.0.0 - dev: true - - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - dependencies: - punycode: 2.3.1 - dev: true - - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: true - - /utrie@1.0.2: - resolution: {integrity: sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==} - dependencies: - base64-arraybuffer: 1.0.2 - dev: false - - /vite@4.5.0: - resolution: {integrity: sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==} - engines: {node: ^14.18.0 || >=16.0.0} - hasBin: true - peerDependencies: - '@types/node': '>= 14' - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - esbuild: 0.18.20 - postcss: 8.4.32 - rollup: 3.29.4 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /webextension-polyfill@0.10.0: - resolution: {integrity: sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==} - dev: false - - /webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - dev: false - - /webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} - engines: {node: '>=10.13.0'} - dev: false - - /webpack-virtual-modules@0.5.0: - resolution: {integrity: sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==} - dev: false - - /whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - dev: false - - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - dependencies: - isexe: 2.0.0 - - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: true - - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - dev: true - - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true - - /yaml@2.3.4: - resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} - engines: {node: '>= 14'} - dev: true - - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} diff --git a/interface/postcss.config.js b/interface/postcss.config.js deleted file mode 100644 index ca8d5ea8..00000000 --- a/interface/postcss.config.js +++ /dev/null @@ -1,9 +0,0 @@ -import tailwindcss from "tailwindcss"; -import autoprefixer from "autoprefixer"; - -export default { - plugins: [ - tailwindcss, - autoprefixer, - ], -}; diff --git a/interface/tailwind.config.js b/interface/tailwind.config.js deleted file mode 100644 index 92fa0285..00000000 --- a/interface/tailwind.config.js +++ /dev/null @@ -1,37 +0,0 @@ -/** @type {import('tailwindcss').Config} */ -export default { - content: [ - "./index.html", - "./src/**/*.{js,ts,jsx,tsx}", - ], - darkMode: "class", - theme: { - fontSize: { - "xs": ".65rem", - "sm": ".775rem", - "base": "0.65rem", - "md": "0.65rem", - "lg": "1rem", - "xl": "1.25rem", - "2xl": "1.5rem", - "3xl": "1.875rem", - "4xl": "2.25rem", - "5xl": "3rem", - "6xl": "4rem", - "7xl": "5rem", - "8xl": "6rem", - "9xl": "8rem", - "10xl": "10rem", - "11xl": "12rem", - "12xl": "14rem", - "13xl": "16rem", - "14xl": "18rem", - }, - extend: { - fontFamily: { - "IconFamily": "IconFamily" - } - } - }, - plugins: [], -}; \ No newline at end of file diff --git a/interface/tsconfig.json b/interface/tsconfig.json deleted file mode 100644 index 4bf8ca46..00000000 --- a/interface/tsconfig.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2020", - "useDefineForClassFields": true, - "lib": ["ES2020", "DOM", "DOM.Iterable"], - "module": "ESNext", - "skipLibCheck": true, - - /* Bundler mode */ - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - "jsx": "react-jsx", - - /* Linting */ - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true - }, - "include": ["src"] -} diff --git a/interface/src/types/AppProps.ts b/interface/types/AppProps.ts similarity index 100% rename from interface/src/types/AppProps.ts rename to interface/types/AppProps.ts diff --git a/interface/src/types/ColorPickerProps.ts b/interface/types/ColorPickerProps.ts similarity index 100% rename from interface/src/types/ColorPickerProps.ts rename to interface/types/ColorPickerProps.ts diff --git a/interface/src/types/SettingsProps.ts b/interface/types/SettingsProps.ts similarity index 100% rename from interface/src/types/SettingsProps.ts rename to interface/types/SettingsProps.ts diff --git a/interface/src/types/SliderProps.ts b/interface/types/SliderProps.ts similarity index 100% rename from interface/src/types/SliderProps.ts rename to interface/types/SliderProps.ts diff --git a/interface/src/types/SwitchProps.ts b/interface/types/SwitchProps.ts similarity index 100% rename from interface/src/types/SwitchProps.ts rename to interface/types/SwitchProps.ts diff --git a/interface/src/types/TabbedContainerProps.ts b/interface/types/TabbedContainerProps.ts similarity index 100% rename from interface/src/types/TabbedContainerProps.ts rename to interface/types/TabbedContainerProps.ts diff --git a/interface/src/vite-env.d.ts b/interface/vite-env.d.ts similarity index 100% rename from interface/src/vite-env.d.ts rename to interface/vite-env.d.ts diff --git a/interface/vite.config.d.ts b/interface/vite.config.d.ts deleted file mode 100644 index 340562af..00000000 --- a/interface/vite.config.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -declare const _default: import("vite").UserConfig; -export default _default; diff --git a/interface/vite.config.ts b/interface/vite.config.ts deleted file mode 100644 index 91ada8a0..00000000 --- a/interface/vite.config.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { sentryVitePlugin } from "@sentry/vite-plugin"; -import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react' - -// https://vitejs.dev/config/ -export default defineConfig({ - plugins: [react(), sentryVitePlugin({ - org: "betterseqta-plus", - project: "betterseqtaplus-popup" - })], - build: { - //outDir: '../../public/popup-dist', - rollupOptions: { - output: { - assetFileNames: 'client/rsc/[ext]/[name][extname]', - chunkFileNames: 'client/rsc/[chunks]/[name].[hash].js', - entryFileNames: 'client/public/client.js' - } - }, - - sourcemap: true - } -}) \ No newline at end of file diff --git a/package.json b/package.json index 8e0a3a39..4fd60b00 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ }, "dependencies": { "@sentry/browser": "^7.85.0", + "@sentry/react": "^7.88.0", "@sentry/webpack-plugin": "^2.10.2", "@types/color": "^3.0.4", "@types/dompurify": "^3.0.5", @@ -43,12 +44,16 @@ "@types/webextension-polyfill": "^0.10.7", "autoprefixer": "^10.4.15", "color": "^4.2.3", + "framer-motion": "^10.16.16", "install": "^0.13.0", "localforage": "^1.10.0", "motion": "^10.16.4", "npm": "^10.1.0", "postcss": "^8.4.29", "react": "^18.2.0", + "react-best-gradient-color-picker": "^2.3.5", + "react-dom": "^18.2.0", + "react-router-dom": "^6.21.0", "sortablejs": "^1.15.0", "tailwindcss": "^3.3.3", "ts-loader": "^9.5.1", diff --git a/tailwind.config.js b/tailwind.config.js index 82b6b0df..7a453307 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -1,20 +1,36 @@ /** @type {import('tailwindcss').Config} */ export default { content: [ - './index.html', - './src/**/*.{js,ts,jsx,tsx}', + "./interface/index.html", + "./interface/**/*.{js,ts,jsx,tsx}", ], - darkMode: 'class', + darkMode: "class", theme: { fontSize: { - 'xs': '.65rem', - 'sm': '.775rem', - 'base': '0.65rem', - 'md': '0.65rem', - 'lg': '1rem', - 'xl': '1.25rem', - '2xl': '1.5rem', - '3xl': '1.875rem', + "xs": ".65rem", + "sm": ".775rem", + "base": "0.65rem", + "md": "0.65rem", + "lg": "1rem", + "xl": "1.25rem", + "2xl": "1.5rem", + "3xl": "1.875rem", + "4xl": "2.25rem", + "5xl": "3rem", + "6xl": "4rem", + "7xl": "5rem", + "8xl": "6rem", + "9xl": "8rem", + "10xl": "10rem", + "11xl": "12rem", + "12xl": "14rem", + "13xl": "16rem", + "14xl": "18rem", + }, + extend: { + fontFamily: { + "IconFamily": "IconFamily" + } } }, plugins: [], From b6729e2fa9115cd7a8a0cd0f5a1bef15f3b20a4a Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Mon, 18 Dec 2023 08:05:14 +1100 Subject: [PATCH 06/46] install react dom types --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 4fd60b00..23a8b4fe 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "@types/color": "^3.0.4", "@types/dompurify": "^3.0.5", "@types/react": "^18.2.21", + "@types/react-dom": "^18.2.18", "@types/sortablejs": "^1.15.7", "@types/webextension-polyfill": "^0.10.7", "autoprefixer": "^10.4.15", From 079e100a597747d624f99248b5685e50ca631110 Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Mon, 18 Dec 2023 08:07:09 +1100 Subject: [PATCH 07/46] clean up manifest.json --- manifest.json | 44 +++++++++++--------------------------------- 1 file changed, 11 insertions(+), 33 deletions(-) diff --git a/manifest.json b/manifest.json index b44fb74b..8f929f35 100644 --- a/manifest.json +++ b/manifest.json @@ -31,39 +31,17 @@ ], "web_accessible_resources": [ { - "resources": ["icons/*"], - "matches": ["*://*/*"] - }, - { - "resources": ["fonts/*"], - "matches": ["*://*/*"] - }, - { - "resources": ["images/*"], - "matches": ["*://*/*"] - }, - { - "resources": ["css/*"], - "matches": ["*://*/*"] - }, - { - "resources": ["popup/*"], - "matches": ["*://*/*"] - }, - { - "resources": ["interface/*"], - "matches": ["*://*/*"] - }, - { - "resources": ["client/*"], - "matches": ["*://*/*"] - }, - { - "resources": ["resources/*"], - "matches": ["*://*/*"] - }, - { - "resources": ["backgrounds/*"], + "resources": [ + "icons/*", + "fonts/*", + "images/*", + "css/*", + "popup/*", + "interface/*", + "client/*", + "resources/*", + "backgrounds/*" + ], "matches": ["*://*/*"] } ] From a3637ff0027bc1c373e724f0a8b4c9126affd173 Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Mon, 18 Dec 2023 08:10:09 +1100 Subject: [PATCH 08/46] clean up web-accessible-resources in manifest --- manifest.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/manifest.json b/manifest.json index 8f929f35..0b9ea451 100644 --- a/manifest.json +++ b/manifest.json @@ -35,10 +35,6 @@ "icons/*", "fonts/*", "images/*", - "css/*", - "popup/*", - "interface/*", - "client/*", "resources/*", "backgrounds/*" ], From 1cb981d7750cfa7bffd195cb5bfdd8fb8b50e577 Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Mon, 18 Dec 2023 08:17:20 +1100 Subject: [PATCH 09/46] remove semicolons with prettier --- .prettierrc | 3 +- pnpm-lock.yaml | 3107 ------------------------------------------------ 2 files changed, 2 insertions(+), 3108 deletions(-) delete mode 100644 pnpm-lock.yaml diff --git a/.prettierrc b/.prettierrc index 222861c3..7c28b83a 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,4 +1,5 @@ { "tabWidth": 2, - "useTabs": false + "useTabs": false, + "semi": false } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml deleted file mode 100644 index 110f1987..00000000 --- a/pnpm-lock.yaml +++ /dev/null @@ -1,3107 +0,0 @@ -lockfileVersion: '6.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -dependencies: - '@sentry/browser': - specifier: ^7.85.0 - version: 7.85.0 - '@sentry/webpack-plugin': - specifier: ^2.10.2 - version: 2.10.2(webpack@5.89.0) - '@types/color': - specifier: ^3.0.4 - version: 3.0.6 - '@types/dompurify': - specifier: ^3.0.5 - version: 3.0.5 - '@types/react': - specifier: ^18.2.21 - version: 18.2.40 - '@types/sortablejs': - specifier: ^1.15.7 - version: 1.15.7 - '@types/webextension-polyfill': - specifier: ^0.10.7 - version: 0.10.7 - autoprefixer: - specifier: ^10.4.15 - version: 10.4.16(postcss@8.4.32) - color: - specifier: ^4.2.3 - version: 4.2.3 - install: - specifier: ^0.13.0 - version: 0.13.0 - localforage: - specifier: ^1.10.0 - version: 1.10.0 - motion: - specifier: ^10.16.4 - version: 10.16.4 - npm: - specifier: ^10.1.0 - version: 10.2.4 - postcss: - specifier: ^8.4.29 - version: 8.4.32 - react: - specifier: ^18.2.0 - version: 18.2.0 - sortablejs: - specifier: ^1.15.0 - version: 1.15.1 - tailwindcss: - specifier: ^3.3.3 - version: 3.3.5 - ts-loader: - specifier: ^9.5.1 - version: 9.5.1(typescript@5.3.2)(webpack@5.89.0) - typescript: - specifier: ^5.2.2 - version: 5.3.2 - -devDependencies: - copy-webpack-plugin: - specifier: ^11.0.0 - version: 11.0.0(webpack@5.89.0) - css-loader: - specifier: ^6.8.1 - version: 6.8.1(webpack@5.89.0) - dompurify: - specifier: ^3.0.5 - version: 3.0.6 - eslint: - specifier: ^8.48.0 - version: 8.55.0 - eslint-config-prettier: - specifier: ^9.0.0 - version: 9.0.0(eslint@8.55.0) - eslint-webpack-plugin: - specifier: ^4.0.1 - version: 4.0.1(eslint@8.55.0)(webpack@5.89.0) - file-loader: - specifier: ^6.2.0 - version: 6.2.0(webpack@5.89.0) - mini-css-extract-plugin: - specifier: ^2.7.6 - version: 2.7.6(webpack@5.89.0) - prettier: - specifier: 3.0.2 - version: 3.0.2 - sass: - specifier: ^1.69.5 - version: 1.69.5 - sass-loader: - specifier: ^13.3.2 - version: 13.3.2(sass@1.69.5)(webpack@5.89.0) - style-loader: - specifier: ^3.3.3 - version: 3.3.3(webpack@5.89.0) - vite: - specifier: ^5.0.10 - version: 5.0.10(sass@1.69.5) - webextension-polyfill: - specifier: ^0.10.0 - version: 0.10.0 - webpack: - specifier: ^5.88.2 - version: 5.89.0(webpack-cli@5.1.4) - webpack-cli: - specifier: ^5.1.4 - version: 5.1.4(webpack@5.89.0) - -packages: - - /@aashutoshrathi/word-wrap@1.2.6: - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - dev: true - - /@alloc/quick-lru@5.2.0: - resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} - engines: {node: '>=10'} - dev: false - - /@discoveryjs/json-ext@0.5.7: - resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} - engines: {node: '>=10.0.0'} - - /@esbuild/android-arm64@0.19.9: - resolution: {integrity: sha512-q4cR+6ZD0938R19MyEW3jEsMzbb/1rulLXiNAJQADD/XYp7pT+rOS5JGxvpRW8dFDEfjW4wLgC/3FXIw4zYglQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm@0.19.9: - resolution: {integrity: sha512-jkYjjq7SdsWuNI6b5quymW0oC83NN5FdRPuCbs9HZ02mfVdAP8B8eeqLSYU3gb6OJEaY5CQabtTFbqBf26H3GA==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-x64@0.19.9: - resolution: {integrity: sha512-KOqoPntWAH6ZxDwx1D6mRntIgZh9KodzgNOy5Ebt9ghzffOk9X2c1sPwtM9P+0eXbefnDhqYfkh5PLP5ULtWFA==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-arm64@0.19.9: - resolution: {integrity: sha512-KBJ9S0AFyLVx2E5D8W0vExqRW01WqRtczUZ8NRu+Pi+87opZn5tL4Y0xT0mA4FtHctd0ZgwNoN639fUUGlNIWw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-x64@0.19.9: - resolution: {integrity: sha512-vE0VotmNTQaTdX0Q9dOHmMTao6ObjyPm58CHZr1UK7qpNleQyxlFlNCaHsHx6Uqv86VgPmR4o2wdNq3dP1qyDQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-arm64@0.19.9: - resolution: {integrity: sha512-uFQyd/o1IjiEk3rUHSwUKkqZwqdvuD8GevWF065eqgYfexcVkxh+IJgwTaGZVu59XczZGcN/YMh9uF1fWD8j1g==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-x64@0.19.9: - resolution: {integrity: sha512-WMLgWAtkdTbTu1AWacY7uoj/YtHthgqrqhf1OaEWnZb7PQgpt8eaA/F3LkV0E6K/Lc0cUr/uaVP/49iE4M4asA==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm64@0.19.9: - resolution: {integrity: sha512-PiPblfe1BjK7WDAKR1Cr9O7VVPqVNpwFcPWgfn4xu0eMemzRp442hXyzF/fSwgrufI66FpHOEJk0yYdPInsmyQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm@0.19.9: - resolution: {integrity: sha512-C/ChPohUYoyUaqn1h17m/6yt6OB14hbXvT8EgM1ZWaiiTYz7nWZR0SYmMnB5BzQA4GXl3BgBO1l8MYqL/He3qw==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ia32@0.19.9: - resolution: {integrity: sha512-f37i/0zE0MjDxijkPSQw1CO/7C27Eojqb+r3BbHVxMLkj8GCa78TrBZzvPyA/FNLUMzP3eyHCVkAopkKVja+6Q==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-loong64@0.19.9: - resolution: {integrity: sha512-t6mN147pUIf3t6wUt3FeumoOTPfmv9Cc6DQlsVBpB7eCpLOqQDyWBP1ymXn1lDw4fNUSb/gBcKAmvTP49oIkaA==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-mips64el@0.19.9: - resolution: {integrity: sha512-jg9fujJTNTQBuDXdmAg1eeJUL4Jds7BklOTkkH80ZgQIoCTdQrDaHYgbFZyeTq8zbY+axgptncko3v9p5hLZtw==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ppc64@0.19.9: - resolution: {integrity: sha512-tkV0xUX0pUUgY4ha7z5BbDS85uI7ABw3V1d0RNTii7E9lbmV8Z37Pup2tsLV46SQWzjOeyDi1Q7Wx2+QM8WaCQ==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-riscv64@0.19.9: - resolution: {integrity: sha512-DfLp8dj91cufgPZDXr9p3FoR++m3ZJ6uIXsXrIvJdOjXVREtXuQCjfMfvmc3LScAVmLjcfloyVtpn43D56JFHg==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-s390x@0.19.9: - resolution: {integrity: sha512-zHbglfEdC88KMgCWpOl/zc6dDYJvWGLiUtmPRsr1OgCViu3z5GncvNVdf+6/56O2Ca8jUU+t1BW261V6kp8qdw==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-x64@0.19.9: - resolution: {integrity: sha512-JUjpystGFFmNrEHQnIVG8hKwvA2DN5o7RqiO1CVX8EN/F/gkCjkUMgVn6hzScpwnJtl2mPR6I9XV1oW8k9O+0A==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/netbsd-x64@0.19.9: - resolution: {integrity: sha512-GThgZPAwOBOsheA2RUlW5UeroRfESwMq/guy8uEe3wJlAOjpOXuSevLRd70NZ37ZrpO6RHGHgEHvPg1h3S1Jug==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/openbsd-x64@0.19.9: - resolution: {integrity: sha512-Ki6PlzppaFVbLnD8PtlVQfsYw4S9n3eQl87cqgeIw+O3sRr9IghpfSKY62mggdt1yCSZ8QWvTZ9jo9fjDSg9uw==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/sunos-x64@0.19.9: - resolution: {integrity: sha512-MLHj7k9hWh4y1ddkBpvRj2b9NCBhfgBt3VpWbHQnXRedVun/hC7sIyTGDGTfsGuXo4ebik2+3ShjcPbhtFwWDw==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-arm64@0.19.9: - resolution: {integrity: sha512-GQoa6OrQ8G08guMFgeXPH7yE/8Dt0IfOGWJSfSH4uafwdC7rWwrfE6P9N8AtPGIjUzdo2+7bN8Xo3qC578olhg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-ia32@0.19.9: - resolution: {integrity: sha512-UOozV7Ntykvr5tSOlGCrqU3NBr3d8JqPes0QWN2WOXfvkWVGRajC+Ym0/Wj88fUgecUCLDdJPDF0Nna2UK3Qtg==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-x64@0.19.9: - resolution: {integrity: sha512-oxoQgglOP7RH6iasDrhY+R/3cHrfwIDvRlT4CGChflq6twk8iENeVvMJjmvBb94Ik1Z+93iGO27err7w6l54GQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@eslint-community/eslint-utils@4.4.0(eslint@8.55.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.55.0 - eslint-visitor-keys: 3.4.3 - dev: true - - /@eslint-community/regexpp@4.10.0: - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true - - /@eslint/eslintrc@2.1.4: - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.6.1 - globals: 13.23.0 - ignore: 5.3.0 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@eslint/js@8.55.0: - resolution: {integrity: sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /@humanwhocodes/config-array@0.11.13: - resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} - engines: {node: '>=10.10.0'} - dependencies: - '@humanwhocodes/object-schema': 2.0.1 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - dev: true - - /@humanwhocodes/object-schema@2.0.1: - resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} - dev: true - - /@jest/schemas@29.6.3: - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@sinclair/typebox': 0.27.8 - dev: true - - /@jest/types@29.6.3: - resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 20.10.2 - '@types/yargs': 17.0.32 - chalk: 4.1.2 - dev: true - - /@jridgewell/gen-mapping@0.3.3: - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.20 - - /@jridgewell/resolve-uri@3.1.1: - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} - engines: {node: '>=6.0.0'} - - /@jridgewell/set-array@1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} - engines: {node: '>=6.0.0'} - - /@jridgewell/source-map@0.3.5: - resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.20 - - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - - /@jridgewell/trace-mapping@0.3.20: - resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} - dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 - - /@motionone/animation@10.16.3: - resolution: {integrity: sha512-QUGWpLbMFLhyqKlngjZhjtxM8IqiJQjLK0DF+XOF6od9nhSvlaeEpOY/UMCRVcZn/9Tr2rZO22EkuCIjYdI74g==} - dependencies: - '@motionone/easing': 10.16.3 - '@motionone/types': 10.16.3 - '@motionone/utils': 10.16.3 - tslib: 2.6.2 - dev: false - - /@motionone/dom@10.16.4: - resolution: {integrity: sha512-HPHlVo/030qpRj9R8fgY50KTN4Ko30moWRTA3L3imrsRBmob93cTYmodln49HYFbQm01lFF7X523OkKY0DX6UA==} - dependencies: - '@motionone/animation': 10.16.3 - '@motionone/generators': 10.16.4 - '@motionone/types': 10.16.3 - '@motionone/utils': 10.16.3 - hey-listen: 1.0.8 - tslib: 2.6.2 - dev: false - - /@motionone/easing@10.16.3: - resolution: {integrity: sha512-HWTMZbTmZojzwEuKT/xCdvoMPXjYSyQvuVM6jmM0yoGU6BWzsmYMeB4bn38UFf618fJCNtP9XeC/zxtKWfbr0w==} - dependencies: - '@motionone/utils': 10.16.3 - tslib: 2.6.2 - dev: false - - /@motionone/generators@10.16.4: - resolution: {integrity: sha512-geFZ3w0Rm0ZXXpctWsSf3REGywmLLujEjxPYpBR0j+ymYwof0xbV6S5kGqqsDKgyWKVWpUInqQYvQfL6fRbXeg==} - dependencies: - '@motionone/types': 10.16.3 - '@motionone/utils': 10.16.3 - tslib: 2.6.2 - dev: false - - /@motionone/svelte@10.16.4: - resolution: {integrity: sha512-zRVqk20lD1xqe+yEDZhMYgftsuHc25+9JSo+r0a0OWUJFocjSV9D/+UGhX4xgJsuwB9acPzXLr20w40VnY2PQA==} - dependencies: - '@motionone/dom': 10.16.4 - tslib: 2.6.2 - dev: false - - /@motionone/types@10.16.3: - resolution: {integrity: sha512-W4jkEGFifDq73DlaZs3HUfamV2t1wM35zN/zX7Q79LfZ2sc6C0R1baUHZmqc/K5F3vSw3PavgQ6HyHLd/MXcWg==} - dev: false - - /@motionone/utils@10.16.3: - resolution: {integrity: sha512-WNWDksJIxQkaI9p9Z9z0+K27xdqISGNFy1SsWVGaiedTHq0iaT6iZujby8fT/ZnZxj1EOaxJtSfUPCFNU5CRoA==} - dependencies: - '@motionone/types': 10.16.3 - hey-listen: 1.0.8 - tslib: 2.6.2 - dev: false - - /@motionone/vue@10.16.4: - resolution: {integrity: sha512-z10PF9JV6SbjFq+/rYabM+8CVlMokgl8RFGvieSGNTmrkQanfHn+15XBrhG3BgUfvmTeSeyShfOHpG0i9zEdcg==} - dependencies: - '@motionone/dom': 10.16.4 - tslib: 2.6.2 - dev: false - - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 - - /@rollup/rollup-android-arm-eabi@4.9.1: - resolution: {integrity: sha512-6vMdBZqtq1dVQ4CWdhFwhKZL6E4L1dV6jUjuBvsavvNJSppzi6dLBbuV+3+IyUREaj9ZFvQefnQm28v4OCXlig==} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-android-arm64@4.9.1: - resolution: {integrity: sha512-Jto9Fl3YQ9OLsTDWtLFPtaIMSL2kwGyGoVCmPC8Gxvym9TCZm4Sie+cVeblPO66YZsYH8MhBKDMGZ2NDxuk/XQ==} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-darwin-arm64@4.9.1: - resolution: {integrity: sha512-LtYcLNM+bhsaKAIGwVkh5IOWhaZhjTfNOkGzGqdHvhiCUVuJDalvDxEdSnhFzAn+g23wgsycmZk1vbnaibZwwA==} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-darwin-x64@4.9.1: - resolution: {integrity: sha512-KyP/byeXu9V+etKO6Lw3E4tW4QdcnzDG/ake031mg42lob5tN+5qfr+lkcT/SGZaH2PdW4Z1NX9GHEkZ8xV7og==} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-arm-gnueabihf@4.9.1: - resolution: {integrity: sha512-Yqz/Doumf3QTKplwGNrCHe/B2p9xqDghBZSlAY0/hU6ikuDVQuOUIpDP/YcmoT+447tsZTmirmjgG3znvSCR0Q==} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-arm64-gnu@4.9.1: - resolution: {integrity: sha512-u3XkZVvxcvlAOlQJ3UsD1rFvLWqu4Ef/Ggl40WAVCuogf4S1nJPHh5RTgqYFpCOvuGJ7H5yGHabjFKEZGExk5Q==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-arm64-musl@4.9.1: - resolution: {integrity: sha512-0XSYN/rfWShW+i+qjZ0phc6vZ7UWI8XWNz4E/l+6edFt+FxoEghrJHjX1EY/kcUGCnZzYYRCl31SNdfOi450Aw==} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-riscv64-gnu@4.9.1: - resolution: {integrity: sha512-LmYIO65oZVfFt9t6cpYkbC4d5lKHLYv5B4CSHRpnANq0VZUQXGcCPXHzbCXCz4RQnx7jvlYB1ISVNCE/omz5cw==} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-x64-gnu@4.9.1: - resolution: {integrity: sha512-kr8rEPQ6ns/Lmr/hiw8sEVj9aa07gh1/tQF2Y5HrNCCEPiCBGnBUt9tVusrcBBiJfIt1yNaXN6r1CCmpbFEDpg==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-linux-x64-musl@4.9.1: - resolution: {integrity: sha512-t4QSR7gN+OEZLG0MiCgPqMWZGwmeHhsM4AkegJ0Kiy6TnJ9vZ8dEIwHw1LcZKhbHxTY32hp9eVCMdR3/I8MGRw==} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-win32-arm64-msvc@4.9.1: - resolution: {integrity: sha512-7XI4ZCBN34cb+BH557FJPmh0kmNz2c25SCQeT9OiFWEgf8+dL6ZwJ8f9RnUIit+j01u07Yvrsuu1rZGxJCc51g==} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-win32-ia32-msvc@4.9.1: - resolution: {integrity: sha512-yE5c2j1lSWOH5jp+Q0qNL3Mdhr8WuqCNVjc6BxbVfS5cAS6zRmdiw7ktb8GNpDCEUJphILY6KACoFoRtKoqNQg==} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@rollup/rollup-win32-x64-msvc@4.9.1: - resolution: {integrity: sha512-PyJsSsafjmIhVgaI1Zdj7m8BB8mMckFah/xbpplObyHfiXzKcI5UOUXRyOdHW7nz4DpMCuzLnF7v5IWHenCwYA==} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@sentry-internal/feedback@7.85.0: - resolution: {integrity: sha512-MlbIN+N8CWFJBjbqMmARe4+UPo9QRhRar0YoOfmNA2Xqk/EwXcjHWkealosHznXH7tqVbjB25QJpHtDystft/Q==} - engines: {node: '>=12'} - dependencies: - '@sentry/core': 7.85.0 - '@sentry/types': 7.85.0 - '@sentry/utils': 7.85.0 - dev: false - - /@sentry-internal/tracing@7.85.0: - resolution: {integrity: sha512-p3YMUwkPCy2su9cm/3+7QYR4RiMI0+07DU1BZtht9NLTzY2O87/yvUbn1v2yHR3vJQTy/+7N0ud9/mPBFznRQQ==} - engines: {node: '>=8'} - dependencies: - '@sentry/core': 7.85.0 - '@sentry/types': 7.85.0 - '@sentry/utils': 7.85.0 - dev: false - - /@sentry/browser@7.85.0: - resolution: {integrity: sha512-x4sH7vTQnZQgy1U7NuN8XwhleAw7YMQitccHeC5m+kpIKGUO7w4Mdvu8rD3dnjmVmZvASpnwocAxy57/vCU6Ww==} - engines: {node: '>=8'} - dependencies: - '@sentry-internal/feedback': 7.85.0 - '@sentry-internal/tracing': 7.85.0 - '@sentry/core': 7.85.0 - '@sentry/replay': 7.85.0 - '@sentry/types': 7.85.0 - '@sentry/utils': 7.85.0 - dev: false - - /@sentry/bundler-plugin-core@2.10.2: - resolution: {integrity: sha512-7IoekLtROlJZqTxtHQ3IhocBuf9dsEq+JjqlHMyZXoq+QKuvJFvMd/4T+r6KjZ15kMZOIkR+spK3V7duH201hw==} - engines: {node: '>= 14'} - dependencies: - '@sentry/cli': 2.22.3 - '@sentry/node': 7.85.0 - '@sentry/utils': 7.85.0 - dotenv: 16.3.1 - find-up: 5.0.0 - glob: 9.3.2 - magic-string: 0.27.0 - unplugin: 1.0.1 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /@sentry/cli-darwin@2.22.3: - resolution: {integrity: sha512-A1DwFTffg3+fF68qujaJI07dk/1H1pRuihlvS5WQ9sD7nQLnXZGoLUht4eULixhDzZYinWHKkcWzQ6k40UTvNA==} - engines: {node: '>=10'} - os: [darwin] - requiresBuild: true - dev: false - optional: true - - /@sentry/cli-linux-arm64@2.22.3: - resolution: {integrity: sha512-PnBPb4LJ+A2LlqLjtVFn4mEizcVdxBSLZvB85pEGzq9DRXjZ6ZEuGWFHTVnWvjd79TB/s0me29QnLc3n4B6lgA==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux, freebsd] - requiresBuild: true - dev: false - optional: true - - /@sentry/cli-linux-arm@2.22.3: - resolution: {integrity: sha512-mDtLVbqbCu/5b/v2quTAMzY/atGlJVvrqO2Wvpro0Jb/LYhn7Y1pVBdoXEDcnOX82/pseFkLT8PFfq/OcezPhA==} - engines: {node: '>=10'} - cpu: [arm] - os: [linux, freebsd] - requiresBuild: true - dev: false - optional: true - - /@sentry/cli-linux-i686@2.22.3: - resolution: {integrity: sha512-wxvbpQ2hiw4hwJWfJMp7K45BV40nXL62f91jLuftFXIbieKX1Li57NNKNu2JUVn7W1bJxkwz/PKGGTXSgeJlRw==} - engines: {node: '>=10'} - cpu: [x86, ia32] - os: [linux, freebsd] - requiresBuild: true - dev: false - optional: true - - /@sentry/cli-linux-x64@2.22.3: - resolution: {integrity: sha512-0GxsYNO5GyRWifeOpng+MmdUFZRA64bgA1n1prsEsXnoeLcm3Zj4Q63hBZmiwz9Qbhf5ibohkpf94a7dI7pv3A==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux, freebsd] - requiresBuild: true - dev: false - optional: true - - /@sentry/cli-win32-i686@2.22.3: - resolution: {integrity: sha512-YERPsd7ClBrxKcmCUw+ZrAvQfbyIZFrqh269hgDuXFodpsB7LPGnI33ilo0uzmKdq2vGppTb6Z3gf1Rbq0Hadg==} - engines: {node: '>=10'} - cpu: [x86, ia32] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@sentry/cli-win32-x64@2.22.3: - resolution: {integrity: sha512-NUh56xWvgJo2KuC9lI6o6nTPXdzbpQUB4qGwJ73L9NP3HT2P1I27jtHyrC2zlXTVlYE23gQZGrL3wgW4Jy80QA==} - engines: {node: '>=10'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: false - optional: true - - /@sentry/cli@2.22.3: - resolution: {integrity: sha512-VFHdtrHsMyTRSZhDLeMyXvit7xB4e81KugIEwMve95c7h5HO672bfmCcM/403CAugj4NzvQ+IR2NKF/2SsEPlg==} - engines: {node: '>= 10'} - hasBin: true - dependencies: - https-proxy-agent: 5.0.1 - node-fetch: 2.7.0 - progress: 2.0.3 - proxy-from-env: 1.1.0 - which: 2.0.2 - optionalDependencies: - '@sentry/cli-darwin': 2.22.3 - '@sentry/cli-linux-arm': 2.22.3 - '@sentry/cli-linux-arm64': 2.22.3 - '@sentry/cli-linux-i686': 2.22.3 - '@sentry/cli-linux-x64': 2.22.3 - '@sentry/cli-win32-i686': 2.22.3 - '@sentry/cli-win32-x64': 2.22.3 - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /@sentry/core@7.85.0: - resolution: {integrity: sha512-DFDAc4tWmHN5IWhr7XbHCiyF1Xgb95jz8Uj/JTX9atlgodId1UIbER77qpEmH3eQGid/QBdqrlR98zCixgSbwg==} - engines: {node: '>=8'} - dependencies: - '@sentry/types': 7.85.0 - '@sentry/utils': 7.85.0 - dev: false - - /@sentry/node@7.85.0: - resolution: {integrity: sha512-uiBtRW9G017NHoCXBlK3ttkTwHXLFyI8ndHpaObtyajKTv3ptGIThVEn7DuK7Pwor//RjwjSEEOa7WDK+FdMVQ==} - engines: {node: '>=8'} - dependencies: - '@sentry-internal/tracing': 7.85.0 - '@sentry/core': 7.85.0 - '@sentry/types': 7.85.0 - '@sentry/utils': 7.85.0 - https-proxy-agent: 5.0.1 - transitivePeerDependencies: - - supports-color - dev: false - - /@sentry/replay@7.85.0: - resolution: {integrity: sha512-zVtTKfO+lu5qTwHpETI/oGo8hU3rdKHr3CdI1vRLw+d60PcAa/pWVlXsQeLRTw8PFwE358gHcpFZezj/11afew==} - engines: {node: '>=12'} - dependencies: - '@sentry-internal/tracing': 7.85.0 - '@sentry/core': 7.85.0 - '@sentry/types': 7.85.0 - '@sentry/utils': 7.85.0 - dev: false - - /@sentry/types@7.85.0: - resolution: {integrity: sha512-R5jR4XkK5tBU2jDiPdSVqzkmjYRr666bcGaFGUHB/xDQCjPsjk+pEmCCL+vpuWoaZmQJUE1hVU7rgnVX81w8zg==} - engines: {node: '>=8'} - dev: false - - /@sentry/utils@7.85.0: - resolution: {integrity: sha512-JZ7seNOLvhjAQ8GeB3GYknPQJkuhF88xAYOaESZP3xPOWBMFUN+IO4RqjMqMLFDniOwsVQS7GB/MfP+hxufieg==} - engines: {node: '>=8'} - dependencies: - '@sentry/types': 7.85.0 - dev: false - - /@sentry/webpack-plugin@2.10.2(webpack@5.89.0): - resolution: {integrity: sha512-sA+oHgxoiLEaxZt3/o3fVsItyR37PIUWSiSkpdxcziekRZ6EM/h0BqW4qXi+46OmLE+ZiB8qtaqid+GUG9C9VA==} - engines: {node: '>= 14'} - peerDependencies: - webpack: '>=4.40.0' - dependencies: - '@sentry/bundler-plugin-core': 2.10.2 - unplugin: 1.0.1 - uuid: 9.0.1 - webpack: 5.89.0(webpack-cli@5.1.4) - transitivePeerDependencies: - - encoding - - supports-color - dev: false - - /@sinclair/typebox@0.27.8: - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - dev: true - - /@types/color-convert@2.0.3: - resolution: {integrity: sha512-2Q6wzrNiuEvYxVQqhh7sXM2mhIhvZR/Paq4FdsQkOMgWsCIkKvSGj8Le1/XalulrmgOzPMqNa0ix+ePY4hTrfg==} - dependencies: - '@types/color-name': 1.1.3 - dev: false - - /@types/color-name@1.1.3: - resolution: {integrity: sha512-87W6MJCKZYDhLAx/J1ikW8niMvmGRyY+rpUxWpL1cO7F8Uu5CHuQoFv+R0/L5pgNdW4jTyda42kv60uwVIPjLw==} - dev: false - - /@types/color@3.0.6: - resolution: {integrity: sha512-NMiNcZFRUAiUUCCf7zkAelY8eV3aKqfbzyFQlXpPIEeoNDbsEHGpb854V3gzTsGKYj830I5zPuOwU/TP5/cW6A==} - dependencies: - '@types/color-convert': 2.0.3 - dev: false - - /@types/dompurify@3.0.5: - resolution: {integrity: sha512-1Wg0g3BtQF7sSb27fJQAKck1HECM6zV1EB66j8JH9i3LCjYabJa0FSdiSgsD5K/RbrsR0SiraKacLB+T8ZVYAg==} - dependencies: - '@types/trusted-types': 2.0.7 - dev: false - - /@types/eslint-scope@3.7.7: - resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} - dependencies: - '@types/eslint': 8.44.8 - '@types/estree': 1.0.5 - - /@types/eslint@8.44.8: - resolution: {integrity: sha512-4K8GavROwhrYl2QXDXm0Rv9epkA8GBFu0EI+XrrnnuCl7u8CWBRusX7fXJfanhZTDWSAL24gDI/UqXyUM0Injw==} - dependencies: - '@types/estree': 1.0.5 - '@types/json-schema': 7.0.15 - - /@types/estree@1.0.5: - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - - /@types/istanbul-lib-coverage@2.0.6: - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} - dev: true - - /@types/istanbul-lib-report@3.0.3: - resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} - dependencies: - '@types/istanbul-lib-coverage': 2.0.6 - dev: true - - /@types/istanbul-reports@3.0.4: - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - dependencies: - '@types/istanbul-lib-report': 3.0.3 - dev: true - - /@types/json-schema@7.0.15: - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - - /@types/node@20.10.2: - resolution: {integrity: sha512-37MXfxkb0vuIlRKHNxwCkb60PNBpR94u4efQuN4JgIAm66zfCDXGSAFCef9XUWFovX2R1ok6Z7MHhtdVXXkkIw==} - dependencies: - undici-types: 5.26.5 - - /@types/prop-types@15.7.11: - resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} - dev: false - - /@types/react@18.2.40: - resolution: {integrity: sha512-H+BUhb9C1zBtogDLAk+KCNRKiHDrqSwQT/0z0PVTwMFBxqg3011ByLomADtgkgMkfwj4AMOiXBReyLTUBg681g==} - dependencies: - '@types/prop-types': 15.7.11 - '@types/scheduler': 0.16.8 - csstype: 3.1.2 - dev: false - - /@types/scheduler@0.16.8: - resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} - dev: false - - /@types/sortablejs@1.15.7: - resolution: {integrity: sha512-PvgWCx1Lbgm88FdQ6S7OGvLIjWS66mudKPlfdrWil0TjsO5zmoZmzoKiiwRShs1dwPgrlkr0N4ewuy0/+QUXYQ==} - dev: false - - /@types/trusted-types@2.0.7: - resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} - dev: false - - /@types/webextension-polyfill@0.10.7: - resolution: {integrity: sha512-10ql7A0qzBmFB+F+qAke/nP1PIonS0TXZAOMVOxEUsm+lGSW6uwVcISFNa0I4Oyj0884TZVWGGMIWeXOVSNFHw==} - dev: false - - /@types/yargs-parser@21.0.3: - resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - dev: true - - /@types/yargs@17.0.32: - resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} - dependencies: - '@types/yargs-parser': 21.0.3 - dev: true - - /@ungap/structured-clone@1.2.0: - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - dev: true - - /@webassemblyjs/ast@1.11.6: - resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} - dependencies: - '@webassemblyjs/helper-numbers': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - - /@webassemblyjs/floating-point-hex-parser@1.11.6: - resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} - - /@webassemblyjs/helper-api-error@1.11.6: - resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} - - /@webassemblyjs/helper-buffer@1.11.6: - resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} - - /@webassemblyjs/helper-numbers@1.11.6: - resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} - dependencies: - '@webassemblyjs/floating-point-hex-parser': 1.11.6 - '@webassemblyjs/helper-api-error': 1.11.6 - '@xtuc/long': 4.2.2 - - /@webassemblyjs/helper-wasm-bytecode@1.11.6: - resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} - - /@webassemblyjs/helper-wasm-section@1.11.6: - resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - - /@webassemblyjs/ieee754@1.11.6: - resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} - dependencies: - '@xtuc/ieee754': 1.2.0 - - /@webassemblyjs/leb128@1.11.6: - resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} - dependencies: - '@xtuc/long': 4.2.2 - - /@webassemblyjs/utf8@1.11.6: - resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} - - /@webassemblyjs/wasm-edit@1.11.6: - resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/helper-wasm-section': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - '@webassemblyjs/wasm-opt': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - '@webassemblyjs/wast-printer': 1.11.6 - - /@webassemblyjs/wasm-gen@1.11.6: - resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/ieee754': 1.11.6 - '@webassemblyjs/leb128': 1.11.6 - '@webassemblyjs/utf8': 1.11.6 - - /@webassemblyjs/wasm-opt@1.11.6: - resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - - /@webassemblyjs/wasm-parser@1.11.6: - resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-api-error': 1.11.6 - '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/ieee754': 1.11.6 - '@webassemblyjs/leb128': 1.11.6 - '@webassemblyjs/utf8': 1.11.6 - - /@webassemblyjs/wast-printer@1.11.6: - resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} - dependencies: - '@webassemblyjs/ast': 1.11.6 - '@xtuc/long': 4.2.2 - - /@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.89.0): - resolution: {integrity: sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==} - engines: {node: '>=14.15.0'} - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x - dependencies: - webpack: 5.89.0(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.89.0) - - /@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.89.0): - resolution: {integrity: sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==} - engines: {node: '>=14.15.0'} - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x - dependencies: - webpack: 5.89.0(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.89.0) - - /@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.89.0): - resolution: {integrity: sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==} - engines: {node: '>=14.15.0'} - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x - webpack-dev-server: '*' - peerDependenciesMeta: - webpack-dev-server: - optional: true - dependencies: - webpack: 5.89.0(webpack-cli@5.1.4) - webpack-cli: 5.1.4(webpack@5.89.0) - - /@xtuc/ieee754@1.2.0: - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - - /@xtuc/long@4.2.2: - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - - /acorn-import-assertions@1.9.0(acorn@8.11.2): - resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} - peerDependencies: - acorn: ^8 - dependencies: - acorn: 8.11.2 - - /acorn-jsx@5.3.2(acorn@8.11.2): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.11.2 - dev: true - - /acorn@8.11.2: - resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} - engines: {node: '>=0.4.0'} - hasBin: true - - /agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - dependencies: - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: false - - /ajv-formats@2.1.1(ajv@8.12.0): - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - dependencies: - ajv: 8.12.0 - dev: true - - /ajv-keywords@3.5.2(ajv@6.12.6): - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} - peerDependencies: - ajv: ^6.9.1 - dependencies: - ajv: 6.12.6 - - /ajv-keywords@5.1.0(ajv@8.12.0): - resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} - peerDependencies: - ajv: ^8.8.2 - dependencies: - ajv: 8.12.0 - fast-deep-equal: 3.1.3 - dev: true - - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - - /ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} - dependencies: - fast-deep-equal: 3.1.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - uri-js: 4.4.1 - dev: true - - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - dev: true - - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - - /any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - dev: false - - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - /arg@5.0.2: - resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - dev: false - - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true - - /autoprefixer@10.4.16(postcss@8.4.32): - resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 - dependencies: - browserslist: 4.22.1 - caniuse-lite: 1.0.30001565 - fraction.js: 4.3.7 - normalize-range: 0.1.2 - picocolors: 1.0.0 - postcss: 8.4.32 - postcss-value-parser: 4.2.0 - dev: false - - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - /big.js@5.2.2: - resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} - dev: true - - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - dependencies: - balanced-match: 1.0.2 - dev: false - - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - - /browserslist@4.22.1: - resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - caniuse-lite: 1.0.30001565 - electron-to-chromium: 1.4.601 - node-releases: 2.0.14 - update-browserslist-db: 1.0.13(browserslist@4.22.1) - - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - dev: true - - /camelcase-css@2.0.1: - resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} - engines: {node: '>= 6'} - dev: false - - /caniuse-lite@1.0.30001565: - resolution: {integrity: sha512-xrE//a3O7TP0vaJ8ikzkD2c2NgcVUvsEe2IvFTntV4Yd1Z9FVzh+gW+enX96L0psrbaFMcVcH2l90xNuGDWc8w==} - - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - /chrome-trace-event@1.0.3: - resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} - engines: {node: '>=6.0'} - - /ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} - dev: true - - /clone-deep@4.0.1: - resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} - engines: {node: '>=6'} - dependencies: - is-plain-object: 2.0.4 - kind-of: 6.0.3 - shallow-clone: 3.0.1 - - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - /color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} - dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.2 - dev: false - - /color@4.2.3: - resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} - engines: {node: '>=12.5.0'} - dependencies: - color-convert: 2.0.1 - color-string: 1.9.1 - dev: false - - /colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - - /commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} - - /commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - /commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - dev: false - - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - /copy-webpack-plugin@11.0.0(webpack@5.89.0): - resolution: {integrity: sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==} - engines: {node: '>= 14.15.0'} - peerDependencies: - webpack: ^5.1.0 - dependencies: - fast-glob: 3.3.2 - glob-parent: 6.0.2 - globby: 13.2.2 - normalize-path: 3.0.0 - schema-utils: 4.2.0 - serialize-javascript: 6.0.1 - webpack: 5.89.0(webpack-cli@5.1.4) - dev: true - - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - /css-loader@6.8.1(webpack@5.89.0): - resolution: {integrity: sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==} - engines: {node: '>= 12.13.0'} - peerDependencies: - webpack: ^5.0.0 - dependencies: - icss-utils: 5.1.0(postcss@8.4.32) - postcss: 8.4.32 - postcss-modules-extract-imports: 3.0.0(postcss@8.4.32) - postcss-modules-local-by-default: 4.0.3(postcss@8.4.32) - postcss-modules-scope: 3.0.0(postcss@8.4.32) - postcss-modules-values: 4.0.0(postcss@8.4.32) - postcss-value-parser: 4.2.0 - semver: 7.5.4 - webpack: 5.89.0(webpack-cli@5.1.4) - dev: true - - /cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true - - /csstype@3.1.2: - resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} - dev: false - - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true - - /didyoumean@1.2.2: - resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - dev: false - - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dependencies: - path-type: 4.0.0 - dev: true - - /dlv@1.1.3: - resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - dev: false - - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dependencies: - esutils: 2.0.3 - dev: true - - /dompurify@3.0.6: - resolution: {integrity: sha512-ilkD8YEnnGh1zJ240uJsW7AzE+2qpbOUYjacomn3AvJ6J4JhKGSZ2nh4wUIXPZrEPppaCLx5jFe8T89Rk8tQ7w==} - dev: true - - /dotenv@16.3.1: - resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} - engines: {node: '>=12'} - dev: false - - /electron-to-chromium@1.4.601: - resolution: {integrity: sha512-SpwUMDWe9tQu8JX5QCO1+p/hChAi9AE9UpoC3rcHVc+gdCGlbT3SGb5I1klgb952HRIyvt9wZhSz9bNBYz9swA==} - - /emojis-list@3.0.0: - resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} - engines: {node: '>= 4'} - dev: true - - /enhanced-resolve@5.15.0: - resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} - engines: {node: '>=10.13.0'} - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.1 - - /envinfo@7.11.0: - resolution: {integrity: sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==} - engines: {node: '>=4'} - hasBin: true - - /es-module-lexer@1.4.1: - resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} - - /esbuild@0.19.9: - resolution: {integrity: sha512-U9CHtKSy+EpPsEBa+/A2gMs/h3ylBC0H0KSqIg7tpztHerLi6nrrcoUJAkNCEPumx8yJ+Byic4BVwHgRbN0TBg==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.19.9 - '@esbuild/android-arm64': 0.19.9 - '@esbuild/android-x64': 0.19.9 - '@esbuild/darwin-arm64': 0.19.9 - '@esbuild/darwin-x64': 0.19.9 - '@esbuild/freebsd-arm64': 0.19.9 - '@esbuild/freebsd-x64': 0.19.9 - '@esbuild/linux-arm': 0.19.9 - '@esbuild/linux-arm64': 0.19.9 - '@esbuild/linux-ia32': 0.19.9 - '@esbuild/linux-loong64': 0.19.9 - '@esbuild/linux-mips64el': 0.19.9 - '@esbuild/linux-ppc64': 0.19.9 - '@esbuild/linux-riscv64': 0.19.9 - '@esbuild/linux-s390x': 0.19.9 - '@esbuild/linux-x64': 0.19.9 - '@esbuild/netbsd-x64': 0.19.9 - '@esbuild/openbsd-x64': 0.19.9 - '@esbuild/sunos-x64': 0.19.9 - '@esbuild/win32-arm64': 0.19.9 - '@esbuild/win32-ia32': 0.19.9 - '@esbuild/win32-x64': 0.19.9 - dev: true - - /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - dev: true - - /eslint-config-prettier@9.0.0(eslint@8.55.0): - resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' - dependencies: - eslint: 8.55.0 - dev: true - - /eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - dev: true - - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /eslint-webpack-plugin@4.0.1(eslint@8.55.0)(webpack@5.89.0): - resolution: {integrity: sha512-fUFcXpui/FftGx3NzvWgLZXlLbu+m74sUxGEgxgoxYcUtkIQbS6SdNNZkS99m5ycb23TfoNYrDpp1k/CK5j6Hw==} - engines: {node: '>= 14.15.0'} - peerDependencies: - eslint: ^8.0.0 - webpack: ^5.0.0 - dependencies: - '@types/eslint': 8.44.8 - eslint: 8.55.0 - jest-worker: 29.7.0 - micromatch: 4.0.5 - normalize-path: 3.0.0 - schema-utils: 4.2.0 - webpack: 5.89.0(webpack-cli@5.1.4) - dev: true - - /eslint@8.55.0: - resolution: {integrity: sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.55.0) - '@eslint-community/regexpp': 4.10.0 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.55.0 - '@humanwhocodes/config-array': 0.11.13 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.23.0 - graphemer: 1.4.0 - ignore: 5.3.0 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.3 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - dev: true - - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - acorn: 8.11.2 - acorn-jsx: 5.3.2(acorn@8.11.2) - eslint-visitor-keys: 3.4.3 - dev: true - - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} - dependencies: - estraverse: 5.3.0 - dev: true - - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - dependencies: - estraverse: 5.3.0 - - /estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: true - - /events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - /fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true - - /fastest-levenshtein@1.0.16: - resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} - engines: {node: '>= 4.9.1'} - - /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} - dependencies: - reusify: 1.0.4 - - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flat-cache: 3.2.0 - dev: true - - /file-loader@6.2.0(webpack@5.89.0): - resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} - engines: {node: '>= 10.13.0'} - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - dependencies: - loader-utils: 2.0.4 - schema-utils: 3.3.0 - webpack: 5.89.0(webpack-cli@5.1.4) - dev: true - - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - /flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flatted: 3.2.9 - keyv: 4.5.4 - rimraf: 3.0.2 - dev: true - - /flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - /flatted@3.2.9: - resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} - dev: true - - /fraction.js@4.3.7: - resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - dev: false - - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - optional: true - - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 - - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - dependencies: - is-glob: 4.0.3 - - /glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - - /glob@7.1.6: - resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: false - - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - - /glob@9.3.2: - resolution: {integrity: sha512-BTv/JhKXFEHsErMte/AnfiSv8yYOLLiyH2lTg8vn02O21zWFgHPTfxtgn1QRe7NRgggUhC8hacR2Re94svHqeA==} - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - fs.realpath: 1.0.0 - minimatch: 7.4.6 - minipass: 4.2.8 - path-scurry: 1.10.1 - dev: false - - /globals@13.23.0: - resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.20.2 - dev: true - - /globby@13.2.2: - resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.0 - merge2: 1.4.1 - slash: 4.0.0 - dev: true - - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: true - - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - /hasown@2.0.0: - resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} - engines: {node: '>= 0.4'} - dependencies: - function-bind: 1.1.2 - - /hey-listen@1.0.8: - resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} - dev: false - - /https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - dependencies: - agent-base: 6.0.2 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: false - - /icss-utils@5.1.0(postcss@8.4.32): - resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - dependencies: - postcss: 8.4.32 - dev: true - - /ignore@5.3.0: - resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} - engines: {node: '>= 4'} - dev: true - - /immediate@3.0.6: - resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} - dev: false - - /immutable@4.3.4: - resolution: {integrity: sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==} - dev: true - - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - dev: true - - /import-local@3.1.0: - resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} - engines: {node: '>=8'} - hasBin: true - dependencies: - pkg-dir: 4.2.0 - resolve-cwd: 3.0.0 - - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - dev: true - - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - /install@0.13.0: - resolution: {integrity: sha512-zDml/jzr2PKU9I8J/xyZBQn8rPCAY//UOYNmR01XwNwyfhEWObo2SWfSl1+0tm1u6PhxLwDnfsT/6jB7OUxqFA==} - engines: {node: '>= 0.10'} - dev: false - - /interpret@3.1.1: - resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} - engines: {node: '>=10.13.0'} - - /is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - dev: false - - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - dependencies: - binary-extensions: 2.2.0 - - /is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} - dependencies: - hasown: 2.0.0 - - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - dev: true - - /is-plain-object@2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} - dependencies: - isobject: 3.0.1 - - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - /isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} - - /jest-util@29.7.0: - resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - '@types/node': 20.10.2 - chalk: 4.1.2 - ci-info: 3.9.0 - graceful-fs: 4.2.11 - picomatch: 2.3.1 - dev: true - - /jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} - dependencies: - '@types/node': 20.10.2 - merge-stream: 2.0.0 - supports-color: 8.1.1 - - /jest-worker@29.7.0: - resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@types/node': 20.10.2 - jest-util: 29.7.0 - merge-stream: 2.0.0 - supports-color: 8.1.1 - dev: true - - /jiti@1.21.0: - resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} - hasBin: true - dev: false - - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - dev: false - - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - dependencies: - argparse: 2.0.1 - dev: true - - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: true - - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - - /json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - dev: true - - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true - - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - dev: true - - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - dependencies: - json-buffer: 3.0.1 - dev: true - - /kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - dev: true - - /lie@3.1.1: - resolution: {integrity: sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==} - dependencies: - immediate: 3.0.6 - dev: false - - /lilconfig@2.1.0: - resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} - engines: {node: '>=10'} - dev: false - - /lilconfig@3.0.0: - resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} - engines: {node: '>=14'} - dev: false - - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - dev: false - - /loader-runner@4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} - engines: {node: '>=6.11.5'} - - /loader-utils@2.0.4: - resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} - engines: {node: '>=8.9.0'} - dependencies: - big.js: 5.2.2 - emojis-list: 3.0.0 - json5: 2.2.3 - dev: true - - /localforage@1.10.0: - resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} - dependencies: - lie: 3.1.1 - dev: false - - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - dependencies: - p-locate: 4.1.0 - - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - dependencies: - p-locate: 5.0.0 - - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true - - /loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - dependencies: - js-tokens: 4.0.0 - dev: false - - /lru-cache@10.1.0: - resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} - engines: {node: 14 || >=16.14} - dev: false - - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - - /magic-string@0.27.0: - resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} - engines: {node: '>=12'} - dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - dev: false - - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - - /mini-css-extract-plugin@2.7.6(webpack@5.89.0): - resolution: {integrity: sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==} - engines: {node: '>= 12.13.0'} - peerDependencies: - webpack: ^5.0.0 - dependencies: - schema-utils: 4.2.0 - webpack: 5.89.0(webpack-cli@5.1.4) - dev: true - - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.11 - - /minimatch@7.4.6: - resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} - engines: {node: '>=10'} - dependencies: - brace-expansion: 2.0.1 - dev: false - - /minipass@4.2.8: - resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} - engines: {node: '>=8'} - dev: false - - /minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} - engines: {node: '>=16 || 14 >=14.17'} - dev: false - - /motion@10.16.4: - resolution: {integrity: sha512-wvBeT0sZNgU6Od1aimjywBikqzm5yE97+L9eM/AoLy01AXNPdcnSDVHB3CoR0dGdHMbp/S0A/PjsJfWg0+k8Mg==} - dependencies: - '@motionone/animation': 10.16.3 - '@motionone/dom': 10.16.4 - '@motionone/svelte': 10.16.4 - '@motionone/types': 10.16.3 - '@motionone/utils': 10.16.3 - '@motionone/vue': 10.16.4 - dev: false - - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - /mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 - dev: false - - /nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true - - /neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - - /node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - dependencies: - whatwg-url: 5.0.0 - dev: false - - /node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} - - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - /normalize-range@0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} - engines: {node: '>=0.10.0'} - dev: false - - /npm@10.2.4: - resolution: {integrity: sha512-umEuYneVEYO9KoEEI8n2sSGmNQeqco/3BSeacRlqIkCzw4E7XGtYSWMeJobxzr6hZ2n9cM+u5TsMTcC5bAgoWA==} - engines: {node: ^18.17.0 || >=20.5.0} - hasBin: true - dev: false - bundledDependencies: - - '@isaacs/string-locale-compare' - - '@npmcli/arborist' - - '@npmcli/config' - - '@npmcli/fs' - - '@npmcli/map-workspaces' - - '@npmcli/package-json' - - '@npmcli/promise-spawn' - - '@npmcli/run-script' - - '@sigstore/tuf' - - abbrev - - archy - - cacache - - chalk - - ci-info - - cli-columns - - cli-table3 - - columnify - - fastest-levenshtein - - fs-minipass - - glob - - graceful-fs - - hosted-git-info - - ini - - init-package-json - - is-cidr - - json-parse-even-better-errors - - libnpmaccess - - libnpmdiff - - libnpmexec - - libnpmfund - - libnpmhook - - libnpmorg - - libnpmpack - - libnpmpublish - - libnpmsearch - - libnpmteam - - libnpmversion - - make-fetch-happen - - minimatch - - minipass - - minipass-pipeline - - ms - - node-gyp - - nopt - - normalize-package-data - - npm-audit-report - - npm-install-checks - - npm-package-arg - - npm-pick-manifest - - npm-profile - - npm-registry-fetch - - npm-user-validate - - npmlog - - p-map - - pacote - - parse-conflict-json - - proc-log - - qrcode-terminal - - read - - semver - - spdx-expression-parse - - ssri - - strip-ansi - - supports-color - - tar - - text-table - - tiny-relative-date - - treeverse - - validate-npm-package-name - - which - - write-file-atomic - - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - dev: false - - /object-hash@3.0.0: - resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} - engines: {node: '>= 6'} - dev: false - - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 - - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} - dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - dev: true - - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - dependencies: - p-try: 2.2.0 - - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - dependencies: - yocto-queue: 0.1.0 - - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - dependencies: - p-limit: 2.3.0 - - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - dependencies: - p-limit: 3.1.0 - - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - dependencies: - callsites: 3.1.0 - dev: true - - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - - /path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - lru-cache: 10.1.0 - minipass: 7.0.4 - dev: false - - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: true - - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - /pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - dev: false - - /pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} - dev: false - - /pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} - dependencies: - find-up: 4.1.0 - - /postcss-import@15.1.0(postcss@8.4.32): - resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} - engines: {node: '>=14.0.0'} - peerDependencies: - postcss: ^8.0.0 - dependencies: - postcss: 8.4.32 - postcss-value-parser: 4.2.0 - read-cache: 1.0.0 - resolve: 1.22.8 - dev: false - - /postcss-js@4.0.1(postcss@8.4.32): - resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} - engines: {node: ^12 || ^14 || >= 16} - peerDependencies: - postcss: ^8.4.21 - dependencies: - camelcase-css: 2.0.1 - postcss: 8.4.32 - dev: false - - /postcss-load-config@4.0.2(postcss@8.4.32): - resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} - engines: {node: '>= 14'} - peerDependencies: - postcss: '>=8.0.9' - ts-node: '>=9.0.0' - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true - dependencies: - lilconfig: 3.0.0 - postcss: 8.4.32 - yaml: 2.3.4 - dev: false - - /postcss-modules-extract-imports@3.0.0(postcss@8.4.32): - resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - dependencies: - postcss: 8.4.32 - dev: true - - /postcss-modules-local-by-default@4.0.3(postcss@8.4.32): - resolution: {integrity: sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - dependencies: - icss-utils: 5.1.0(postcss@8.4.32) - postcss: 8.4.32 - postcss-selector-parser: 6.0.13 - postcss-value-parser: 4.2.0 - dev: true - - /postcss-modules-scope@3.0.0(postcss@8.4.32): - resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - dependencies: - postcss: 8.4.32 - postcss-selector-parser: 6.0.13 - dev: true - - /postcss-modules-values@4.0.0(postcss@8.4.32): - resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - dependencies: - icss-utils: 5.1.0(postcss@8.4.32) - postcss: 8.4.32 - dev: true - - /postcss-nested@6.0.1(postcss@8.4.32): - resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.2.14 - dependencies: - postcss: 8.4.32 - postcss-selector-parser: 6.0.13 - dev: false - - /postcss-selector-parser@6.0.13: - resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} - engines: {node: '>=4'} - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - - /postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - - /postcss@8.4.32: - resolution: {integrity: sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==} - engines: {node: ^10 || ^12 || >=14} - dependencies: - nanoid: 3.3.7 - picocolors: 1.0.0 - source-map-js: 1.0.2 - - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: true - - /prettier@3.0.2: - resolution: {integrity: sha512-o2YR9qtniXvwEZlOKbveKfDQVyqxbEIWn48Z8m3ZJjBjcCmUy3xZGIv+7AkaeuaTr6yPXJjwv07ZWlsWbEy1rQ==} - engines: {node: '>=14'} - hasBin: true - dev: true - - /progress@2.0.3: - resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} - engines: {node: '>=0.4.0'} - dev: false - - /proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - dev: false - - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - /randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - dependencies: - safe-buffer: 5.2.1 - - /react@18.2.0: - resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} - engines: {node: '>=0.10.0'} - dependencies: - loose-envify: 1.4.0 - dev: false - - /read-cache@1.0.0: - resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} - dependencies: - pify: 2.3.0 - dev: false - - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - dependencies: - picomatch: 2.3.1 - - /rechoir@0.8.0: - resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} - engines: {node: '>= 10.13.0'} - dependencies: - resolve: 1.22.8 - - /require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - dev: true - - /resolve-cwd@3.0.0: - resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} - engines: {node: '>=8'} - dependencies: - resolve-from: 5.0.0 - - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - dev: true - - /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - - /resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true - dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true - dependencies: - glob: 7.2.3 - dev: true - - /rollup@4.9.1: - resolution: {integrity: sha512-pgPO9DWzLoW/vIhlSoDByCzcpX92bKEorbgXuZrqxByte3JFk2xSW2JEeAcyLc9Ru9pqcNNW+Ob7ntsk2oT/Xw==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.9.1 - '@rollup/rollup-android-arm64': 4.9.1 - '@rollup/rollup-darwin-arm64': 4.9.1 - '@rollup/rollup-darwin-x64': 4.9.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.9.1 - '@rollup/rollup-linux-arm64-gnu': 4.9.1 - '@rollup/rollup-linux-arm64-musl': 4.9.1 - '@rollup/rollup-linux-riscv64-gnu': 4.9.1 - '@rollup/rollup-linux-x64-gnu': 4.9.1 - '@rollup/rollup-linux-x64-musl': 4.9.1 - '@rollup/rollup-win32-arm64-msvc': 4.9.1 - '@rollup/rollup-win32-ia32-msvc': 4.9.1 - '@rollup/rollup-win32-x64-msvc': 4.9.1 - fsevents: 2.3.3 - dev: true - - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - dependencies: - queue-microtask: 1.2.3 - - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - /sass-loader@13.3.2(sass@1.69.5)(webpack@5.89.0): - resolution: {integrity: sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg==} - engines: {node: '>= 14.15.0'} - peerDependencies: - fibers: '>= 3.1.0' - node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 - sass: ^1.3.0 - sass-embedded: '*' - webpack: ^5.0.0 - peerDependenciesMeta: - fibers: - optional: true - node-sass: - optional: true - sass: - optional: true - sass-embedded: - optional: true - dependencies: - neo-async: 2.6.2 - sass: 1.69.5 - webpack: 5.89.0(webpack-cli@5.1.4) - dev: true - - /sass@1.69.5: - resolution: {integrity: sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ==} - engines: {node: '>=14.0.0'} - hasBin: true - dependencies: - chokidar: 3.5.3 - immutable: 4.3.4 - source-map-js: 1.0.2 - dev: true - - /schema-utils@3.3.0: - resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} - engines: {node: '>= 10.13.0'} - dependencies: - '@types/json-schema': 7.0.15 - ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) - - /schema-utils@4.2.0: - resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==} - engines: {node: '>= 12.13.0'} - dependencies: - '@types/json-schema': 7.0.15 - ajv: 8.12.0 - ajv-formats: 2.1.1(ajv@8.12.0) - ajv-keywords: 5.1.0(ajv@8.12.0) - dev: true - - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - - /serialize-javascript@6.0.1: - resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} - dependencies: - randombytes: 2.1.0 - - /shallow-clone@3.0.1: - resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} - engines: {node: '>=8'} - dependencies: - kind-of: 6.0.3 - - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - /simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - dependencies: - is-arrayish: 0.3.2 - dev: false - - /slash@4.0.0: - resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} - engines: {node: '>=12'} - dev: true - - /sortablejs@1.15.1: - resolution: {integrity: sha512-P5Cjvb0UG1ZVNiDPj/n4V+DinttXG6K8n7vM/HQf0C25K3YKQTQY6fsr/sEGsJGpQ9exmPxluHxKBc0mLKU1lQ==} - dev: false - - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} - engines: {node: '>=0.10.0'} - - /source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - /source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} - dev: false - - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - dev: true - - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - dev: true - - /style-loader@3.3.3(webpack@5.89.0): - resolution: {integrity: sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw==} - engines: {node: '>= 12.13.0'} - peerDependencies: - webpack: ^5.0.0 - dependencies: - webpack: 5.89.0(webpack-cli@5.1.4) - dev: true - - /sucrase@3.34.0: - resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==} - engines: {node: '>=8'} - hasBin: true - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - commander: 4.1.1 - glob: 7.1.6 - lines-and-columns: 1.2.4 - mz: 2.7.0 - pirates: 4.0.6 - ts-interface-checker: 0.1.13 - dev: false - - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - - /supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - dependencies: - has-flag: 4.0.0 - - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - - /tailwindcss@3.3.5: - resolution: {integrity: sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==} - engines: {node: '>=14.0.0'} - hasBin: true - dependencies: - '@alloc/quick-lru': 5.2.0 - arg: 5.0.2 - chokidar: 3.5.3 - didyoumean: 1.2.2 - dlv: 1.1.3 - fast-glob: 3.3.2 - glob-parent: 6.0.2 - is-glob: 4.0.3 - jiti: 1.21.0 - lilconfig: 2.1.0 - micromatch: 4.0.5 - normalize-path: 3.0.0 - object-hash: 3.0.0 - picocolors: 1.0.0 - postcss: 8.4.32 - postcss-import: 15.1.0(postcss@8.4.32) - postcss-js: 4.0.1(postcss@8.4.32) - postcss-load-config: 4.0.2(postcss@8.4.32) - postcss-nested: 6.0.1(postcss@8.4.32) - postcss-selector-parser: 6.0.13 - resolve: 1.22.8 - sucrase: 3.34.0 - transitivePeerDependencies: - - ts-node - dev: false - - /tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - - /terser-webpack-plugin@5.3.9(webpack@5.89.0): - resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true - dependencies: - '@jridgewell/trace-mapping': 0.3.20 - jest-worker: 27.5.1 - schema-utils: 3.3.0 - serialize-javascript: 6.0.1 - terser: 5.24.0 - webpack: 5.89.0(webpack-cli@5.1.4) - - /terser@5.24.0: - resolution: {integrity: sha512-ZpGR4Hy3+wBEzVEnHvstMvqpD/nABNelQn/z2r0fjVWGQsN3bpOLzQlqDxmb4CDZnXq5lpjnQ+mHQLAOpfM5iw==} - engines: {node: '>=10'} - hasBin: true - dependencies: - '@jridgewell/source-map': 0.3.5 - acorn: 8.11.2 - commander: 2.20.3 - source-map-support: 0.5.21 - - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true - - /thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} - dependencies: - thenify: 3.3.1 - dev: false - - /thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - dependencies: - any-promise: 1.3.0 - dev: false - - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - dependencies: - is-number: 7.0.0 - - /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - dev: false - - /ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - dev: false - - /ts-loader@9.5.1(typescript@5.3.2)(webpack@5.89.0): - resolution: {integrity: sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==} - engines: {node: '>=12.0.0'} - peerDependencies: - typescript: '*' - webpack: ^5.0.0 - dependencies: - chalk: 4.1.2 - enhanced-resolve: 5.15.0 - micromatch: 4.0.5 - semver: 7.5.4 - source-map: 0.7.4 - typescript: 5.3.2 - webpack: 5.89.0(webpack-cli@5.1.4) - dev: false - - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - dev: false - - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - dev: true - - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - dev: true - - /typescript@5.3.2: - resolution: {integrity: sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==} - engines: {node: '>=14.17'} - hasBin: true - dev: false - - /undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - - /unplugin@1.0.1: - resolution: {integrity: sha512-aqrHaVBWW1JVKBHmGo33T5TxeL0qWzfvjWokObHA9bYmN7eNDkwOxmLjhioHl9878qDFMAaT51XNroRyuz7WxA==} - dependencies: - acorn: 8.11.2 - chokidar: 3.5.3 - webpack-sources: 3.2.3 - webpack-virtual-modules: 0.5.0 - dev: false - - /update-browserslist-db@1.0.13(browserslist@4.22.1): - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - dependencies: - browserslist: 4.22.1 - escalade: 3.1.1 - picocolors: 1.0.0 - - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - dependencies: - punycode: 2.3.1 - - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - - /uuid@9.0.1: - resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} - hasBin: true - dev: false - - /vite@5.0.10(sass@1.69.5): - resolution: {integrity: sha512-2P8J7WWgmc355HUMlFrwofacvr98DAjoE52BfdbwQtyLH06XKwaL/FMnmKM2crF0iX4MpmMKoDlNCB1ok7zHCw==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - dependencies: - esbuild: 0.19.9 - postcss: 8.4.32 - rollup: 4.9.1 - sass: 1.69.5 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /watchpack@2.4.0: - resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} - engines: {node: '>=10.13.0'} - dependencies: - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - - /webextension-polyfill@0.10.0: - resolution: {integrity: sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==} - dev: true - - /webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - dev: false - - /webpack-cli@5.1.4(webpack@5.89.0): - resolution: {integrity: sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==} - engines: {node: '>=14.15.0'} - hasBin: true - peerDependencies: - '@webpack-cli/generators': '*' - webpack: 5.x.x - webpack-bundle-analyzer: '*' - webpack-dev-server: '*' - peerDependenciesMeta: - '@webpack-cli/generators': - optional: true - webpack-bundle-analyzer: - optional: true - webpack-dev-server: - optional: true - dependencies: - '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.89.0) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.89.0) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack@5.89.0) - colorette: 2.0.20 - commander: 10.0.1 - cross-spawn: 7.0.3 - envinfo: 7.11.0 - fastest-levenshtein: 1.0.16 - import-local: 3.1.0 - interpret: 3.1.1 - rechoir: 0.8.0 - webpack: 5.89.0(webpack-cli@5.1.4) - webpack-merge: 5.10.0 - - /webpack-merge@5.10.0: - resolution: {integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==} - engines: {node: '>=10.0.0'} - dependencies: - clone-deep: 4.0.1 - flat: 5.0.2 - wildcard: 2.0.1 - - /webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} - engines: {node: '>=10.13.0'} - - /webpack-virtual-modules@0.5.0: - resolution: {integrity: sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==} - dev: false - - /webpack@5.89.0(webpack-cli@5.1.4): - resolution: {integrity: sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true - dependencies: - '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.5 - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/wasm-edit': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - acorn: 8.11.2 - acorn-import-assertions: 1.9.0(acorn@8.11.2) - browserslist: 4.22.1 - chrome-trace-event: 1.0.3 - enhanced-resolve: 5.15.0 - es-module-lexer: 1.4.1 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 3.3.0 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.9(webpack@5.89.0) - watchpack: 2.4.0 - webpack-cli: 5.1.4(webpack@5.89.0) - webpack-sources: 3.2.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - - /whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - dev: false - - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - dependencies: - isexe: 2.0.0 - - /wildcard@2.0.1: - resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} - - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - - /yaml@2.3.4: - resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} - engines: {node: '>= 14'} - dev: false - - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} From fff993a651869a4edd952b59612b56bc4b7c5da8 Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Mon, 18 Dec 2023 16:21:26 +1100 Subject: [PATCH 10/46] clean up dependencies --- src/SEQTA.ts | 668 ++++++++++++++++++------------------ src/seqta/utils/GetPrefs.ts | 6 - 2 files changed, 331 insertions(+), 343 deletions(-) delete mode 100644 src/seqta/utils/GetPrefs.ts diff --git a/src/SEQTA.ts b/src/SEQTA.ts index bdc34ffb..3bbf9c0e 100644 --- a/src/SEQTA.ts +++ b/src/SEQTA.ts @@ -1,32 +1,27 @@ import * as Sentry from "@sentry/browser"; -import browser from 'webextension-polyfill'; import { animate, spring, stagger } from 'motion'; -import Sortable from 'sortablejs'; -import Color from 'color'; +import loading, { AppendLoadingSymbol } from './seqta/ui/Loading'; +import Color from 'color'; import MenuitemSVGKey from './seqta/content/MenuItemSVGKey.json'; -import ShortcutLinks from './seqta/content/links.json'; - -import { appendBackgroundToUI } from './seqta/ui/ImageBackgrounds'; -import loading, { AppendLoadingSymbol } from './seqta/ui/Loading'; import { MessageHandler } from './seqta/utils/MessageListener'; -import { updateAllColors } from './seqta/ui/colors/Manager'; -import StorageListener from './seqta/utils/StorageListener'; -import { updateBgDurations } from './seqta/ui/Animation'; -import { enableCurrentTheme } from './seqta/ui/Themes'; -import stringToHTML from './seqta/utils/stringToHTML'; -import { response } from './seqta/utils/GetPrefs'; import { SettingsState } from "./types/storage"; -import { onError } from './seqta/utils/onError'; -import { delay } from "./seqta/utils/delay"; - -import iframeCSS from "./css/iframe.scss?inline"; - +import ShortcutLinks from './seqta/content/links.json'; +import Sortable from 'sortablejs'; +import StorageListener from './seqta/utils/StorageListener'; +import { appendBackgroundToUI } from './seqta/ui/ImageBackgrounds'; // Icons import assessmentsicon from './seqta/icons/assessmentsIcon'; +import browser from 'webextension-polyfill'; import coursesicon from './seqta/icons/coursesIcon'; - +import { delay } from "./seqta/utils/delay"; +import { enableCurrentTheme } from './seqta/ui/Themes'; +import iframeCSS from "./css/iframe.scss?inline"; +import { onError } from './seqta/utils/onError'; +import stringToHTML from './seqta/utils/stringToHTML'; +import { updateAllColors } from './seqta/ui/colors/Manager'; +import { updateBgDurations } from './seqta/ui/Animation'; browser.storage.local.get([ "telemetry" ]).then((telemetry) => { if (telemetry.telemetry === true) { @@ -726,7 +721,6 @@ function main(storedSetting: SettingsState) { } updateAllColors(storedSetting); - InjectStyles(); loading(); InjectCustomIcons(); HideMenuItems(); @@ -740,13 +734,6 @@ function main(storedSetting: SettingsState) { } } -function InjectStyles() { - import('./css/injected.scss'); - const inject = GetCSSElement('css/injected.css'); - document.head.appendChild(inject); - document.getElementsByTagName('html')[0].appendChild(inject); -} - function InjectCustomIcons() { const fontURL = browser.runtime.getURL('fonts/IconFamily.woff'); @@ -2183,85 +2170,77 @@ function AddCustomShortcutsToPage() { result.then(open, onError) } -function SendHomePage() { - setTimeout(function () { - // Sends the html data for the home page - console.log('[BetterSEQTA] Started Loading Home Page'); - document.title = 'Home ― SEQTA Learn'; - var element = document.querySelector('[data-key=home]'); +async function SendHomePage() { + // Sends the html data for the home page + console.log('[BetterSEQTA] Started Loading Home Page'); + document.title = 'Home ― SEQTA Learn'; + var element = document.querySelector('[data-key=home]'); - // Apply the active class to indicate clicked on home button - element!.classList.add('active'); + // Apply the active class to indicate clicked on home button + element!.classList.add('active'); - // Remove all current elements in the main div to add new elements - var main = document.getElementById('main'); - main!.innerHTML = ''; + // Remove all current elements in the main div to add new elements + var main = document.getElementById('main'); + main!.innerHTML = ''; - const titlediv = document.getElementById('title')!.firstChild; - ((titlediv!) as HTMLElement).innerText = 'Home'; - (document.querySelector('link[rel*="icon"]')! as HTMLLinkElement).href = - browser.runtime.getURL('icons/icon-48.png'); + const titlediv = document.getElementById('title')!.firstChild; + ((titlediv!) as HTMLElement).innerText = 'Home'; + (document.querySelector('link[rel*="icon"]')! as HTMLLinkElement).href = + browser.runtime.getURL('icons/icon-48.png'); - currentSelectedDate = new Date(); + currentSelectedDate = new Date(); - // Creates the root of the home page added to the main div - var html = stringToHTML('
'); - - // Appends the html file to main div - // Note : firstChild of html is done due to needing to grab the body from the stringToHTML function - main!.append(html.firstChild!); + // Creates the root of the home page added to the main div + var html = stringToHTML('
'); + + // Appends the html file to main div + // Note : firstChild of html is done due to needing to grab the body from the stringToHTML function + main!.append(html.firstChild!); - // Gets the current date - const date = new Date(); + // Gets the current date + const date = new Date(); - // Formats the current date used send a request for timetable and notices later - var TodayFormatted = - date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + (date.getDate() < 10 ? '0' : '') + date.getDate(); - - // Replaces actual date with a selected date. Used for testing. - // TodayFormatted = "2020-08-31"; - - // Creates the shortcut container into the home container - var ShortcutStr = '
'; - var Shortcut = stringToHTML(ShortcutStr); - // Appends the shortcut container into the home container - document.getElementById('home-container')!.append(Shortcut.firstChild!); - - // Creates the container div for the timetable portion of the home page - var TimetableStr = '

Today\'s Lessons

'; - var Timetable = stringToHTML(TimetableStr); - // Appends the timetable container into the home container - document.getElementById('home-container')!.append(Timetable.firstChild!); - callHomeTimetable(TodayFormatted, true) - - var timetablearrowback = document.getElementById('home-timetable-back'); - var timetablearrowforward = document.getElementById( - 'home-timetable-forward', - ); + // Formats the current date used send a request for timetable and notices later + var TodayFormatted = + date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + (date.getDate() < 10 ? '0' : '') + date.getDate(); + + // Replaces actual date with a selected date. Used for testing. + // TodayFormatted = "2020-08-31"; + + // Creates the shortcut container into the home container + var ShortcutStr = '
'; + var Shortcut = stringToHTML(ShortcutStr); + // Appends the shortcut container into the home container + document.getElementById('home-container')!.append(Shortcut.firstChild!); + + // Creates the container div for the timetable portion of the home page + var TimetableStr = '

Today\'s Lessons

'; + var Timetable = stringToHTML(TimetableStr); + // Appends the timetable container into the home container + document.getElementById('home-container')!.append(Timetable.firstChild!); + callHomeTimetable(TodayFormatted, true) + + var timetablearrowback = document.getElementById('home-timetable-back'); + var timetablearrowforward = document.getElementById( + 'home-timetable-forward', + ); - function SetTimetableSubtitle() { - var homelessonsubtitle = document.getElementById('home-lesson-subtitle'); - const date = new Date(); - if ( - date.getFullYear() == currentSelectedDate.getFullYear() && - date.getMonth() == currentSelectedDate.getMonth() - ) { - if (date.getDate() == currentSelectedDate.getDate()) { - // Change text to Today's Lessons - homelessonsubtitle!.innerText = 'Today\'s Lessons'; - } else if (date.getDate() - 1 == currentSelectedDate.getDate()) { - // Change text to Yesterday's Lessons - homelessonsubtitle!.innerText = 'Yesterday\'s Lessons'; - } else if (date.getDate() + 1 == currentSelectedDate.getDate()) { - // Change text to Tomorrow's Lessons - homelessonsubtitle!.innerText = 'Tomorrow\'s Lessons'; - } else { - // Change text to date of the day - homelessonsubtitle!.innerText = `${currentSelectedDate.toLocaleString( - 'en-us', - { weekday: 'short' }, - )} ${currentSelectedDate.toLocaleDateString('en-au')}`; - } + function SetTimetableSubtitle() { + var homelessonsubtitle = document.getElementById('home-lesson-subtitle'); + const date = new Date(); + if ( + date.getFullYear() == currentSelectedDate.getFullYear() && + date.getMonth() == currentSelectedDate.getMonth() + ) { + if (date.getDate() == currentSelectedDate.getDate()) { + // Change text to Today's Lessons + homelessonsubtitle!.innerText = 'Today\'s Lessons'; + } else if (date.getDate() - 1 == currentSelectedDate.getDate()) { + // Change text to Yesterday's Lessons + homelessonsubtitle!.innerText = 'Yesterday\'s Lessons'; + } else if (date.getDate() + 1 == currentSelectedDate.getDate()) { + // Change text to Tomorrow's Lessons + homelessonsubtitle!.innerText = 'Tomorrow\'s Lessons'; } else { // Change text to date of the day homelessonsubtitle!.innerText = `${currentSelectedDate.toLocaleString( @@ -2269,99 +2248,192 @@ function SendHomePage() { { weekday: 'short' }, )} ${currentSelectedDate.toLocaleDateString('en-au')}`; } + } else { + // Change text to date of the day + homelessonsubtitle!.innerText = `${currentSelectedDate.toLocaleString( + 'en-us', + { weekday: 'short' }, + )} ${currentSelectedDate.toLocaleDateString('en-au')}`; } + } - function changeTimetable(value: any) { - currentSelectedDate.setDate(currentSelectedDate.getDate() + value); - let FormattedDate = - currentSelectedDate.getFullYear() + - '-' + - (currentSelectedDate.getMonth() + 1) + - '-' + - currentSelectedDate.getDate(); - callHomeTimetable(FormattedDate, true); - SetTimetableSubtitle(); - } + function changeTimetable(value: any) { + currentSelectedDate.setDate(currentSelectedDate.getDate() + value); + let FormattedDate = + currentSelectedDate.getFullYear() + + '-' + + (currentSelectedDate.getMonth() + 1) + + '-' + + currentSelectedDate.getDate(); + callHomeTimetable(FormattedDate, true); + SetTimetableSubtitle(); + } - timetablearrowback!.addEventListener('click', function () { - changeTimetable(-1); - }); - timetablearrowforward!.addEventListener('click', function () { - changeTimetable(1); - }); + timetablearrowback!.addEventListener('click', function () { + changeTimetable(-1); + }); + timetablearrowforward!.addEventListener('click', function () { + changeTimetable(1); + }); - // Adds the shortcuts to the shortcut container - const result = browser.storage.local.get(['shortcuts']) - function open (result: any) { + // Adds the shortcuts to the shortcut container + const result = browser.storage.local.get(['shortcuts']) + function open (result: any) { - const shortcuts = Object.values(result)[0]; - addShortcuts(shortcuts); - } - result.then(open, onError) + const shortcuts = Object.values(result)[0]; + addShortcuts(shortcuts); + } + result.then(open, onError) - // Creates the upcoming container and appends to the home container - var upcomingcontainer = document.createElement('div'); - upcomingcontainer.classList.add('upcoming-container'); - upcomingcontainer.classList.add('border'); - - let upcomingtitlediv = CreateElement('div', 'upcoming-title'); - let upcomingtitle = document.createElement('h2'); - upcomingtitle.classList.add('home-subtitle'); - upcomingtitle.innerText = 'Upcoming Assessments'; - upcomingtitlediv.append(upcomingtitle); - - let upcomingfilterdiv = CreateElement( - 'div', - 'upcoming-filters', - 'upcoming-filters', - ); - upcomingtitlediv.append(upcomingfilterdiv); + // Creates the upcoming container and appends to the home container + var upcomingcontainer = document.createElement('div'); + upcomingcontainer.classList.add('upcoming-container'); + upcomingcontainer.classList.add('border'); + + let upcomingtitlediv = CreateElement('div', 'upcoming-title'); + let upcomingtitle = document.createElement('h2'); + upcomingtitle.classList.add('home-subtitle'); + upcomingtitle.innerText = 'Upcoming Assessments'; + upcomingtitlediv.append(upcomingtitle); + + let upcomingfilterdiv = CreateElement( + 'div', + 'upcoming-filters', + 'upcoming-filters', + ); + upcomingtitlediv.append(upcomingfilterdiv); - upcomingcontainer.append(upcomingtitlediv); + upcomingcontainer.append(upcomingtitlediv); - let upcomingitems = document.createElement('div'); - upcomingitems.id = 'upcoming-items'; - upcomingitems.classList.add('upcoming-items'); + let upcomingitems = document.createElement('div'); + upcomingitems.id = 'upcoming-items'; + upcomingitems.classList.add('upcoming-items'); - upcomingcontainer.append(upcomingitems); + upcomingcontainer.append(upcomingitems); - document.getElementById('home-container')!.append(upcomingcontainer); + document.getElementById('home-container')!.append(upcomingcontainer); - // Creates the notices container into the home container - const NoticesStr = String.raw` -
-
-

Notices

- -
-
-
` - - var Notices = stringToHTML(NoticesStr); - // Appends the shortcut container into the home container - document.getElementById('home-container')!.append(Notices.firstChild!); + // Creates the notices container into the home container + const NoticesStr = String.raw` +
+
+

Notices

+ +
+
+
` + + var Notices = stringToHTML(NoticesStr); + // Appends the shortcut container into the home container + document.getElementById('home-container')!.append(Notices.firstChild!); - animate( - '.home-container > div', - { opacity: [0, 1], y: [10, 0] }, - { - delay: stagger(0.2, { start: 0 }), - duration: 0.6, - easing: [.22, .03, .26, 1] - } - ); + animate( + '.home-container > div', + { opacity: [0, 1], y: [10, 0] }, + { + delay: stagger(0.2, { start: 0 }), + duration: 0.6, + easing: [.22, .03, .26, 1] + } + ); + + callHomeTimetable(TodayFormatted); + + const GetPrefs = await fetch(`${location.origin}/seqta/student/load/prefs?`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ asArray: true, request: 'userPrefs' }) + }) + + const response = await GetPrefs.json() + + const labelArray = response.payload[1].value.split(' ') + + const xhr2 = new XMLHttpRequest() + xhr2.open( + 'POST', + `${location.origin}/seqta/student/load/notices?`, + true + ) + xhr2.setRequestHeader('Content-Type', 'application/json; charset=utf-8') + + xhr2.onreadystatechange = function () { + if (xhr2.readyState === 4) { + const NoticesPayload = JSON.parse(xhr2.response) + const NoticeContainer = document.getElementById('notice-container') + if (NoticesPayload.payload.length === 0) { + if (!NoticeContainer!.innerText) { + // If no notices: display no notices + const dummyNotice = document.createElement('div') + dummyNotice.textContent = 'No notices for today.' + dummyNotice.classList.add('dummynotice') + NoticeContainer!.append(dummyNotice) + } + } else { + if (!NoticeContainer!.innerText) { + // For each element in the response json: + const result = browser.storage.local.get(['DarkMode']) + function noticeInfoDiv (result: any) { + for (let i = 0; i < NoticesPayload.payload.length; i++) { + if (labelArray.includes(JSON.stringify(NoticesPayload.payload[i].label))) { + // Create a div, and place information from json response + const NewNotice = document.createElement('div') + NewNotice.classList.add('notice') + const title = stringToHTML( + '

' + NoticesPayload.payload[i].title + '

' + ) + NewNotice.append(title.firstChild!) + + if (NoticesPayload.payload[i].label_title !== undefined) { + const label = stringToHTML( + '
' + NoticesPayload.payload[i].label_title + '
' + ) + NewNotice.append(label.firstChild!) + } - callHomeTimetable(TodayFormatted); - const labelArray = response.payload[1].value.split(' ') + const staff = stringToHTML( + '
' + NoticesPayload.payload[i].staff + '
' + ) + NewNotice.append(staff.firstChild!) + // Converts the string into HTML + const content = stringToHTML(NoticesPayload.payload[i].contents.replace(/\[\[[\w]+[:][\w]+[\]\]]+/g, '').replace(/ +/, ' '), true) + for (let i = 0; i < content.childNodes.length; i++) { + NewNotice.append(content.childNodes[i]) + } + // Gets the colour for the top section of each notice + + let colour = NoticesPayload.payload[i].colour + if (typeof (colour) === 'string') { + const rgb = GetThresholdOfColor(colour) + const DarkModeResult = result.DarkMode + if (rgb < 100 && DarkModeResult) { + colour = undefined + } + } - const xhr2 = new XMLHttpRequest() - xhr2.open( - 'POST', - `${location.origin}/seqta/student/load/notices?`, - true - ) + const colourbar = document.createElement('div') + colourbar.classList.add('colourbar') + colourbar.style.background = 'var(--colour)' + NewNotice.style.cssText = `--colour: ${colour}` + // Appends the colour bar to the new notice + NewNotice.append(colourbar) + // Appends the new notice into the notice container + NoticeContainer!.append(NewNotice) + } + } + } + result.then(noticeInfoDiv, onError) + } + } + } + } + // Data sent as the POST request + const dateControl = document.querySelector('input[type="date"]') as HTMLInputElement + xhr2.send(JSON.stringify({ date: dateControl!.value })) + function onInputChange (e: any) { + xhr2.open('POST', `${location.origin}/seqta/student/load/notices?`, true) xhr2.setRequestHeader('Content-Type', 'application/json; charset=utf-8') - + xhr2.send(JSON.stringify({ date: e.target.value })) xhr2.onreadystatechange = function () { if (xhr2.readyState === 4) { const NoticesPayload = JSON.parse(xhr2.response) @@ -2375,187 +2447,109 @@ function SendHomePage() { NoticeContainer!.append(dummyNotice) } } else { - if (!NoticeContainer!.innerText) { - // For each element in the response json: - const result = browser.storage.local.get(['DarkMode']) - function noticeInfoDiv (result: any) { - for (let i = 0; i < NoticesPayload.payload.length; i++) { - if (labelArray.includes(JSON.stringify(NoticesPayload.payload[i].label))) { - // Create a div, and place information from json response - const NewNotice = document.createElement('div') - NewNotice.classList.add('notice') - const title = stringToHTML( - '

' + NoticesPayload.payload[i].title + '

' - ) - NewNotice.append(title.firstChild!) - - if (NoticesPayload.payload[i].label_title !== undefined) { - const label = stringToHTML( - '
' + NoticesPayload.payload[i].label_title + '
' - ) - NewNotice.append(label.firstChild!) - } + document.querySelectorAll('.notice').forEach(e => e.remove()) + // For each element in the response json: + const result = browser.storage.local.get(['DarkMode']) + function noticeInfoDiv (result: any) { + for (let i = 0; i < NoticesPayload.payload.length; i++) { + + if (labelArray.includes(JSON.stringify(NoticesPayload.payload[i].label))) { + // Create a div, and place information from json response + const NewNotice = document.createElement('div') + NewNotice.classList.add('notice') + const title = stringToHTML( + '

' + NoticesPayload.payload[i].title + '

' + ) + NewNotice.append(title.firstChild!) - const staff = stringToHTML( - '
' + NoticesPayload.payload[i].staff + '
' + if (NoticesPayload.payload[i].label_title !== undefined) { + const label = stringToHTML( + '
' + NoticesPayload.payload[i].label_title + '
' ) - NewNotice.append(staff.firstChild!) - // Converts the string into HTML - const content = stringToHTML(NoticesPayload.payload[i].contents.replace(/\[\[[\w]+[:][\w]+[\]\]]+/g, '').replace(/ +/, ' '), true) - for (let i = 0; i < content.childNodes.length; i++) { - NewNotice.append(content.childNodes[i]) - } - // Gets the colour for the top section of each notice - - let colour = NoticesPayload.payload[i].colour - if (typeof (colour) === 'string') { - const rgb = GetThresholdOfColor(colour) - const DarkModeResult = result.DarkMode - if (rgb < 100 && DarkModeResult) { - colour = undefined - } - } - - const colourbar = document.createElement('div') - colourbar.classList.add('colourbar') - colourbar.style.background = 'var(--colour)' - NewNotice.style.cssText = `--colour: ${colour}` - // Appends the colour bar to the new notice - NewNotice.append(colourbar) - // Appends the new notice into the notice container - NoticeContainer!.append(NewNotice) + NewNotice.append(label.firstChild!) } - } - } - result.then(noticeInfoDiv, onError) - } - } - } - } - // Data sent as the POST request - const dateControl = document.querySelector('input[type="date"]') as HTMLInputElement - xhr2.send(JSON.stringify({ date: dateControl!.value })) - function onInputChange (e: any) { - xhr2.open('POST', `${location.origin}/seqta/student/load/notices?`, true) - xhr2.setRequestHeader('Content-Type', 'application/json; charset=utf-8') - xhr2.send(JSON.stringify({ date: e.target.value })) - xhr2.onreadystatechange = function () { - if (xhr2.readyState === 4) { - const NoticesPayload = JSON.parse(xhr2.response) - const NoticeContainer = document.getElementById('notice-container') - if (NoticesPayload.payload.length === 0) { - if (!NoticeContainer!.innerText) { - // If no notices: display no notices - const dummyNotice = document.createElement('div') - dummyNotice.textContent = 'No notices for today.' - dummyNotice.classList.add('dummynotice') - NoticeContainer!.append(dummyNotice) - } - } else { - document.querySelectorAll('.notice').forEach(e => e.remove()) - // For each element in the response json: - const result = browser.storage.local.get(['DarkMode']) - function noticeInfoDiv (result: any) { - for (let i = 0; i < NoticesPayload.payload.length; i++) { - - if (labelArray.includes(JSON.stringify(NoticesPayload.payload[i].label))) { - // Create a div, and place information from json response - const NewNotice = document.createElement('div') - NewNotice.classList.add('notice') - const title = stringToHTML( - '

' + NoticesPayload.payload[i].title + '

' - ) - NewNotice.append(title.firstChild!) - if (NoticesPayload.payload[i].label_title !== undefined) { - const label = stringToHTML( - '
' + NoticesPayload.payload[i].label_title + '
' - ) - NewNotice.append(label.firstChild!) - } - - const staff = stringToHTML( - '
' + NoticesPayload.payload[i].staff + '
' - ) - NewNotice.append(staff.firstChild!) - // Converts the string into HTML - const content = stringToHTML(NoticesPayload.payload[i].contents.replace(/\[\[[\w]+[:][\w]+[\]\]]+/g, '').replace(/ +/, ' '), true) - for (let i = 0; i < content.childNodes.length; i++) { - NewNotice.append(content.childNodes[i]) - } - // Gets the colour for the top section of each notice - - let colour = NoticesPayload.payload[i].colour - if (typeof (colour) === 'string') { - const rgb = GetThresholdOfColor(colour) - const DarkModeResult = result.DarkMode - if (rgb < 100 && DarkModeResult) { - colour = undefined - } + const staff = stringToHTML( + '
' + NoticesPayload.payload[i].staff + '
' + ) + NewNotice.append(staff.firstChild!) + // Converts the string into HTML + const content = stringToHTML(NoticesPayload.payload[i].contents.replace(/\[\[[\w]+[:][\w]+[\]\]]+/g, '').replace(/ +/, ' '), true) + for (let i = 0; i < content.childNodes.length; i++) { + NewNotice.append(content.childNodes[i]) + } + // Gets the colour for the top section of each notice + + let colour = NoticesPayload.payload[i].colour + if (typeof (colour) === 'string') { + const rgb = GetThresholdOfColor(colour) + const DarkModeResult = result.DarkMode + if (rgb < 100 && DarkModeResult) { + colour = undefined } - - const colourbar = document.createElement('div') - colourbar.classList.add('colourbar') - colourbar.style.background = 'var(--colour)' - NewNotice.style.cssText = `--colour: ${colour}` - // Appends the colour bar to the new notice - NewNotice.append(colourbar) - // Appends the new notice into the notice container - NoticeContainer!.append(NewNotice) } + + const colourbar = document.createElement('div') + colourbar.classList.add('colourbar') + colourbar.style.background = 'var(--colour)' + NewNotice.style.cssText = `--colour: ${colour}` + // Appends the colour bar to the new notice + NewNotice.append(colourbar) + // Appends the new notice into the notice container + NoticeContainer!.append(NewNotice) } } - result.then(noticeInfoDiv, onError) } + result.then(noticeInfoDiv, onError) } } } - dateControl.addEventListener('input', onInputChange) + } + dateControl.addEventListener('input', onInputChange) - // Sends similar HTTP Post Request for the notices - const result1 = browser.storage.local.get() - function open1 (result: any) { - if (result.notificationcollector) { - enableNotificationCollector(); - } + // Sends similar HTTP Post Request for the notices + const result1 = browser.storage.local.get() + function open1 (result: any) { + if (result.notificationcollector) { + enableNotificationCollector(); } - result1.then(open1, onError) - let activeClassList: any; - GetUpcomingAssessments().then((assessments) => { - GetActiveClasses().then((classes) => { - // Gets all subjects for the student - for (let i = 0; i < classes.length; i++) { - const element = classes[i]; - // eslint-disable-next-line - if (element.hasOwnProperty("active")) { // for some reason eslint gets mad, even though it works? - // Finds the active class list with the current subjects - activeClassList = classes[i]; - } - } - let activeSubjects = activeClassList.subjects; - - let activeSubjectCodes = []; - // Gets the code for each of the subjects and puts them in an array - let element; - for (let i = 0; i < activeSubjects.length; i++) { - element = activeSubjects[i]; - activeSubjectCodes.push(element.code); + } + result1.then(open1, onError) + let activeClassList: any; + GetUpcomingAssessments().then((assessments) => { + GetActiveClasses().then((classes) => { + // Gets all subjects for the student + for (let i = 0; i < classes.length; i++) { + const element = classes[i]; + // eslint-disable-next-line + if (element.hasOwnProperty("active")) { // for some reason eslint gets mad, even though it works? + // Finds the active class list with the current subjects + activeClassList = classes[i]; } + } + let activeSubjects = activeClassList.subjects; + + let activeSubjectCodes = []; + // Gets the code for each of the subjects and puts them in an array + let element; + for (let i = 0; i < activeSubjects.length; i++) { + element = activeSubjects[i]; + activeSubjectCodes.push(element.code); + } - let CurrentAssessments = []; - for (let i = 0; i < assessments.length; i++) { - element = assessments[i]; - if (activeSubjectCodes.includes(element.code)) { - CurrentAssessments.push(element); - } + let CurrentAssessments = []; + for (let i = 0; i < assessments.length; i++) { + element = assessments[i]; + if (activeSubjectCodes.includes(element.code)) { + CurrentAssessments.push(element); } + } - CurrentAssessments.sort(comparedate); + CurrentAssessments.sort(comparedate); - CreateUpcomingSection(CurrentAssessments, activeSubjects); - }); + CreateUpcomingSection(CurrentAssessments, activeSubjects); }); - }, 8); + }); } export function addShortcuts(shortcuts: any) { diff --git a/src/seqta/utils/GetPrefs.ts b/src/seqta/utils/GetPrefs.ts deleted file mode 100644 index 81bf86ba..00000000 --- a/src/seqta/utils/GetPrefs.ts +++ /dev/null @@ -1,6 +0,0 @@ -const GetPrefs = await fetch(`${location.origin}/seqta/student/load/prefs?`, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ asArray: true, request: 'userPrefs' }) - }) - export const response = await GetPrefs.json() \ No newline at end of file From 1d7a0034f915d9462a36b83bd73ecff1c25047d5 Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Wed, 20 Dec 2023 12:30:38 +1100 Subject: [PATCH 11/46] code cleanup --- src/SEQTA.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SEQTA.ts b/src/SEQTA.ts index 3bbf9c0e..6b431306 100644 --- a/src/SEQTA.ts +++ b/src/SEQTA.ts @@ -328,7 +328,7 @@ async function DeleteWhatsNew() { { easing: [.22, .03, .26, 1] } ).finished.then(() => { bkelement!.remove(); - }); + }); } export function CreateBackground() { From cdb09b751780de175982649f0471fcb494f569a6 Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Wed, 20 Dec 2023 13:08:31 +1100 Subject: [PATCH 12/46] move interface to src/ folder --- manifest.json | 2 +- {interface => src/interface}/SettingsContext.tsx | 0 {interface => src/interface}/SettingsPage.tsx | 0 .../interface}/assets/betterseqta-dark-full.png | Bin .../interface}/assets/betterseqta-light-full.png | Bin .../interface}/assets/presetBackgrounds.tsx | 0 {interface => src/interface}/assets/react.svg | 0 .../interface}/assets/themeCovers/hacker.jpeg | Bin {interface => src/interface}/assets/themes.tsx | 0 .../interface}/components/BackgroundSelector.css | 0 .../interface}/components/BackgroundSelector.tsx | 0 {interface => src/interface}/components/Picker.css | 0 {interface => src/interface}/components/Picker.tsx | 0 .../interface}/components/PickerSwatch.tsx | 0 {interface => src/interface}/components/Slider.css | 0 {interface => src/interface}/components/Slider.tsx | 0 {interface => src/interface}/components/Switch.css | 0 {interface => src/interface}/components/Switch.tsx | 0 .../interface}/components/TabbedContainer.tsx | 0 .../interface}/components/ThemeSelector.tsx | 0 .../interface}/hooks/BackgroundDataLoader.tsx | 0 .../interface}/hooks/ThemeManagment.tsx | 0 {interface => src/interface}/hooks/settingsState.ts | 0 {interface => src/interface}/index.css | 0 {interface => src/interface}/index.html | 0 {interface => src/interface}/main.d.ts | 0 {interface => src/interface}/main.tsx | 0 {interface => src/interface}/pages/About.tsx | 0 {interface => src/interface}/pages/Settings.tsx | 0 {interface => src/interface}/pages/Shortcuts.tsx | 0 {interface => src/interface}/pages/Themes.tsx | 0 {interface => src/interface}/types/AppProps.ts | 0 .../interface}/types/ColorPickerProps.ts | 0 {interface => src/interface}/types/SettingsProps.ts | 0 {interface => src/interface}/types/SliderProps.ts | 0 {interface => src/interface}/types/SwitchProps.ts | 0 .../interface}/types/TabbedContainerProps.ts | 0 {interface => src/interface}/vite-env.d.ts | 0 tailwind.config.js | 3 +-- vite.config.js | 2 +- 40 files changed, 3 insertions(+), 4 deletions(-) rename {interface => src/interface}/SettingsContext.tsx (100%) rename {interface => src/interface}/SettingsPage.tsx (100%) rename {interface => src/interface}/assets/betterseqta-dark-full.png (100%) rename {interface => src/interface}/assets/betterseqta-light-full.png (100%) rename {interface => src/interface}/assets/presetBackgrounds.tsx (100%) rename {interface => src/interface}/assets/react.svg (100%) rename {interface => src/interface}/assets/themeCovers/hacker.jpeg (100%) rename {interface => src/interface}/assets/themes.tsx (100%) rename {interface => src/interface}/components/BackgroundSelector.css (100%) rename {interface => src/interface}/components/BackgroundSelector.tsx (100%) rename {interface => src/interface}/components/Picker.css (100%) rename {interface => src/interface}/components/Picker.tsx (100%) rename {interface => src/interface}/components/PickerSwatch.tsx (100%) rename {interface => src/interface}/components/Slider.css (100%) rename {interface => src/interface}/components/Slider.tsx (100%) rename {interface => src/interface}/components/Switch.css (100%) rename {interface => src/interface}/components/Switch.tsx (100%) rename {interface => src/interface}/components/TabbedContainer.tsx (100%) rename {interface => src/interface}/components/ThemeSelector.tsx (100%) rename {interface => src/interface}/hooks/BackgroundDataLoader.tsx (100%) rename {interface => src/interface}/hooks/ThemeManagment.tsx (100%) rename {interface => src/interface}/hooks/settingsState.ts (100%) rename {interface => src/interface}/index.css (100%) rename {interface => src/interface}/index.html (100%) rename {interface => src/interface}/main.d.ts (100%) rename {interface => src/interface}/main.tsx (100%) rename {interface => src/interface}/pages/About.tsx (100%) rename {interface => src/interface}/pages/Settings.tsx (100%) rename {interface => src/interface}/pages/Shortcuts.tsx (100%) rename {interface => src/interface}/pages/Themes.tsx (100%) rename {interface => src/interface}/types/AppProps.ts (100%) rename {interface => src/interface}/types/ColorPickerProps.ts (100%) rename {interface => src/interface}/types/SettingsProps.ts (100%) rename {interface => src/interface}/types/SliderProps.ts (100%) rename {interface => src/interface}/types/SwitchProps.ts (100%) rename {interface => src/interface}/types/TabbedContainerProps.ts (100%) rename {interface => src/interface}/vite-env.d.ts (100%) diff --git a/manifest.json b/manifest.json index 0b9ea451..77b76387 100644 --- a/manifest.json +++ b/manifest.json @@ -10,7 +10,7 @@ }, "action": { "browser_style": true, - "default_popup": "interface/index.html#settings", + "default_popup": "src/interface/index.html#settings", "default_icon": { "32": "icons/icon-32.png", "48": "icons/icon-48.png", diff --git a/interface/SettingsContext.tsx b/src/interface/SettingsContext.tsx similarity index 100% rename from interface/SettingsContext.tsx rename to src/interface/SettingsContext.tsx diff --git a/interface/SettingsPage.tsx b/src/interface/SettingsPage.tsx similarity index 100% rename from interface/SettingsPage.tsx rename to src/interface/SettingsPage.tsx diff --git a/interface/assets/betterseqta-dark-full.png b/src/interface/assets/betterseqta-dark-full.png similarity index 100% rename from interface/assets/betterseqta-dark-full.png rename to src/interface/assets/betterseqta-dark-full.png diff --git a/interface/assets/betterseqta-light-full.png b/src/interface/assets/betterseqta-light-full.png similarity index 100% rename from interface/assets/betterseqta-light-full.png rename to src/interface/assets/betterseqta-light-full.png diff --git a/interface/assets/presetBackgrounds.tsx b/src/interface/assets/presetBackgrounds.tsx similarity index 100% rename from interface/assets/presetBackgrounds.tsx rename to src/interface/assets/presetBackgrounds.tsx diff --git a/interface/assets/react.svg b/src/interface/assets/react.svg similarity index 100% rename from interface/assets/react.svg rename to src/interface/assets/react.svg diff --git a/interface/assets/themeCovers/hacker.jpeg b/src/interface/assets/themeCovers/hacker.jpeg similarity index 100% rename from interface/assets/themeCovers/hacker.jpeg rename to src/interface/assets/themeCovers/hacker.jpeg diff --git a/interface/assets/themes.tsx b/src/interface/assets/themes.tsx similarity index 100% rename from interface/assets/themes.tsx rename to src/interface/assets/themes.tsx diff --git a/interface/components/BackgroundSelector.css b/src/interface/components/BackgroundSelector.css similarity index 100% rename from interface/components/BackgroundSelector.css rename to src/interface/components/BackgroundSelector.css diff --git a/interface/components/BackgroundSelector.tsx b/src/interface/components/BackgroundSelector.tsx similarity index 100% rename from interface/components/BackgroundSelector.tsx rename to src/interface/components/BackgroundSelector.tsx diff --git a/interface/components/Picker.css b/src/interface/components/Picker.css similarity index 100% rename from interface/components/Picker.css rename to src/interface/components/Picker.css diff --git a/interface/components/Picker.tsx b/src/interface/components/Picker.tsx similarity index 100% rename from interface/components/Picker.tsx rename to src/interface/components/Picker.tsx diff --git a/interface/components/PickerSwatch.tsx b/src/interface/components/PickerSwatch.tsx similarity index 100% rename from interface/components/PickerSwatch.tsx rename to src/interface/components/PickerSwatch.tsx diff --git a/interface/components/Slider.css b/src/interface/components/Slider.css similarity index 100% rename from interface/components/Slider.css rename to src/interface/components/Slider.css diff --git a/interface/components/Slider.tsx b/src/interface/components/Slider.tsx similarity index 100% rename from interface/components/Slider.tsx rename to src/interface/components/Slider.tsx diff --git a/interface/components/Switch.css b/src/interface/components/Switch.css similarity index 100% rename from interface/components/Switch.css rename to src/interface/components/Switch.css diff --git a/interface/components/Switch.tsx b/src/interface/components/Switch.tsx similarity index 100% rename from interface/components/Switch.tsx rename to src/interface/components/Switch.tsx diff --git a/interface/components/TabbedContainer.tsx b/src/interface/components/TabbedContainer.tsx similarity index 100% rename from interface/components/TabbedContainer.tsx rename to src/interface/components/TabbedContainer.tsx diff --git a/interface/components/ThemeSelector.tsx b/src/interface/components/ThemeSelector.tsx similarity index 100% rename from interface/components/ThemeSelector.tsx rename to src/interface/components/ThemeSelector.tsx diff --git a/interface/hooks/BackgroundDataLoader.tsx b/src/interface/hooks/BackgroundDataLoader.tsx similarity index 100% rename from interface/hooks/BackgroundDataLoader.tsx rename to src/interface/hooks/BackgroundDataLoader.tsx diff --git a/interface/hooks/ThemeManagment.tsx b/src/interface/hooks/ThemeManagment.tsx similarity index 100% rename from interface/hooks/ThemeManagment.tsx rename to src/interface/hooks/ThemeManagment.tsx diff --git a/interface/hooks/settingsState.ts b/src/interface/hooks/settingsState.ts similarity index 100% rename from interface/hooks/settingsState.ts rename to src/interface/hooks/settingsState.ts diff --git a/interface/index.css b/src/interface/index.css similarity index 100% rename from interface/index.css rename to src/interface/index.css diff --git a/interface/index.html b/src/interface/index.html similarity index 100% rename from interface/index.html rename to src/interface/index.html diff --git a/interface/main.d.ts b/src/interface/main.d.ts similarity index 100% rename from interface/main.d.ts rename to src/interface/main.d.ts diff --git a/interface/main.tsx b/src/interface/main.tsx similarity index 100% rename from interface/main.tsx rename to src/interface/main.tsx diff --git a/interface/pages/About.tsx b/src/interface/pages/About.tsx similarity index 100% rename from interface/pages/About.tsx rename to src/interface/pages/About.tsx diff --git a/interface/pages/Settings.tsx b/src/interface/pages/Settings.tsx similarity index 100% rename from interface/pages/Settings.tsx rename to src/interface/pages/Settings.tsx diff --git a/interface/pages/Shortcuts.tsx b/src/interface/pages/Shortcuts.tsx similarity index 100% rename from interface/pages/Shortcuts.tsx rename to src/interface/pages/Shortcuts.tsx diff --git a/interface/pages/Themes.tsx b/src/interface/pages/Themes.tsx similarity index 100% rename from interface/pages/Themes.tsx rename to src/interface/pages/Themes.tsx diff --git a/interface/types/AppProps.ts b/src/interface/types/AppProps.ts similarity index 100% rename from interface/types/AppProps.ts rename to src/interface/types/AppProps.ts diff --git a/interface/types/ColorPickerProps.ts b/src/interface/types/ColorPickerProps.ts similarity index 100% rename from interface/types/ColorPickerProps.ts rename to src/interface/types/ColorPickerProps.ts diff --git a/interface/types/SettingsProps.ts b/src/interface/types/SettingsProps.ts similarity index 100% rename from interface/types/SettingsProps.ts rename to src/interface/types/SettingsProps.ts diff --git a/interface/types/SliderProps.ts b/src/interface/types/SliderProps.ts similarity index 100% rename from interface/types/SliderProps.ts rename to src/interface/types/SliderProps.ts diff --git a/interface/types/SwitchProps.ts b/src/interface/types/SwitchProps.ts similarity index 100% rename from interface/types/SwitchProps.ts rename to src/interface/types/SwitchProps.ts diff --git a/interface/types/TabbedContainerProps.ts b/src/interface/types/TabbedContainerProps.ts similarity index 100% rename from interface/types/TabbedContainerProps.ts rename to src/interface/types/TabbedContainerProps.ts diff --git a/interface/vite-env.d.ts b/src/interface/vite-env.d.ts similarity index 100% rename from interface/vite-env.d.ts rename to src/interface/vite-env.d.ts diff --git a/tailwind.config.js b/tailwind.config.js index 7a453307..f672d7be 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -1,8 +1,7 @@ /** @type {import('tailwindcss').Config} */ export default { content: [ - "./interface/index.html", - "./interface/**/*.{js,ts,jsx,tsx}", + "./src/**/*.{js,ts,jsx,tsx,html}", ], darkMode: "class", theme: { diff --git a/vite.config.js b/vite.config.js index 3d6f9710..934fd28f 100644 --- a/vite.config.js +++ b/vite.config.js @@ -1,5 +1,5 @@ -import { defineConfig } from 'vite' import { crx } from '@crxjs/vite-plugin' +import { defineConfig } from 'vite' import manifest from './manifest.json' export default defineConfig({ From 20f3ebc2ee10b5d3c9738a34017fe2007e8ffb2e Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Wed, 20 Dec 2023 13:15:06 +1100 Subject: [PATCH 13/46] move telemetry code to only run on Seqta pages --- src/SEQTA.ts | 38 ++++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/src/SEQTA.ts b/src/SEQTA.ts index 6b431306..7ffeebaa 100644 --- a/src/SEQTA.ts +++ b/src/SEQTA.ts @@ -23,26 +23,6 @@ import stringToHTML from './seqta/utils/stringToHTML'; import { updateAllColors } from './seqta/ui/colors/Manager'; import { updateBgDurations } from './seqta/ui/Animation'; -browser.storage.local.get([ "telemetry" ]).then((telemetry) => { - if (telemetry.telemetry === true) { - Sentry.init({ - dsn: "https://54bdb68e80b45182ded22ecf9fe9529c@o4506347383291904.ingest.sentry.io/4506347462393856", - integrations: [ - new Sentry.BrowserTracing({ - // Set 'tracePropagationTargets' to control for which URLs distributed tracing should be enabled - tracePropagationTargets: ["localhost", /^https:\/\/yourserver\.io\/api/], - }), - new Sentry.Replay(), - ], - // Performance Monitoring - tracesSampleRate: 1.0, // Capture 100% of the transactions - // Session Replay - replaysSessionSampleRate: 0.1, // This sets the sample rate at 10%. You may want to change it to 100% while in development and then sample at a lower rate in production. - replaysOnErrorSampleRate: 1.0, // If you're not already sampling the entire session, change the sample rate to 100% when sampling sessions where errors occur. - }); - } -}) - declare global { interface Window { chrome?: any; @@ -710,6 +690,24 @@ function main(storedSetting: SettingsState) { browser.runtime.sendMessage({ type: 'setDefaultStorage' }); } + if (storedSetting.telemetry && storedSetting.onoff) { + Sentry.init({ + dsn: "https://54bdb68e80b45182ded22ecf9fe9529c@o4506347383291904.ingest.sentry.io/4506347462393856", + integrations: [ + new Sentry.BrowserTracing({ + // Set 'tracePropagationTargets' to control for which URLs distributed tracing should be enabled + tracePropagationTargets: ["localhost", /^https:\/\/yourserver\.io\/api/], + }), + new Sentry.Replay(), + ], + // Performance Monitoring + tracesSampleRate: 1.0, // Capture 100% of the transactions + // Session Replay + replaysSessionSampleRate: 0.1, // This sets the sample rate at 10%. You may want to change it to 100% while in development and then sample at a lower rate in production. + replaysOnErrorSampleRate: 1.0, // If you're not already sampling the entire session, change the sample rate to 100% when sampling sessions where errors occur. + }); + } + const handleDisabled = () => { waitForElm('.code').then(AppendElementsToDisabledPage); }; From fea726acc6123d42bb215ee0d7f70fa60cc3b41a Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Wed, 20 Dec 2023 13:19:18 +1100 Subject: [PATCH 14/46] code cleanup --- src/SEQTA.ts | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/SEQTA.ts b/src/SEQTA.ts index 7ffeebaa..b89a20aa 100644 --- a/src/SEQTA.ts +++ b/src/SEQTA.ts @@ -862,17 +862,6 @@ function addExtensionSettings() { }; } -function saveNewOrder(sortable: any) { - var order = sortable.toArray(); - browser.storage.local.set({ menuorder: order }); -} - -function cloneAttributes(target: any, source: any) { - [...source.attributes].forEach((attr) => { - target.setAttribute(attr.nodeName, attr.nodeValue); - }); -} - export function OpenMenuOptions() { const result = browser.storage.local.get() function open (result: any) { @@ -1089,6 +1078,17 @@ export function OpenMenuOptions() { result.then(open, onError) } +function saveNewOrder(sortable: any) { + var order = sortable.toArray(); + browser.storage.local.set({ menuorder: order }); +} + +function cloneAttributes(target: any, source: any) { + [...source.attributes].forEach((attr) => { + target.setAttribute(attr.nodeName, attr.nodeValue); + }); +} + function ReplaceMenuSVG(element: HTMLElement, svg: string) { let item = element.firstChild as HTMLElement; item!.firstChild!.remove(); From 34c304adb6e9881e7178500f69747f2b805cc454 Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Wed, 20 Dec 2023 13:35:48 +1100 Subject: [PATCH 15/46] fix css and interface links --- src/SEQTA.ts | 6 +++--- src/css/{documentload.js => documentload.ts} | 0 src/css/{iframe.js => iframe.ts} | 0 src/css/{injected.js => injected.ts} | 0 4 files changed, 3 insertions(+), 3 deletions(-) rename src/css/{documentload.js => documentload.ts} (100%) rename src/css/{iframe.js => iframe.ts} (100%) rename src/css/{injected.js => injected.ts} (100%) diff --git a/src/SEQTA.ts b/src/SEQTA.ts index b89a20aa..714d0af5 100644 --- a/src/SEQTA.ts +++ b/src/SEQTA.ts @@ -11,7 +11,6 @@ import ShortcutLinks from './seqta/content/links.json'; import Sortable from 'sortablejs'; import StorageListener from './seqta/utils/StorageListener'; import { appendBackgroundToUI } from './seqta/ui/ImageBackgrounds'; -// Icons import assessmentsicon from './seqta/icons/assessmentsIcon'; import browser from 'webextension-polyfill'; import coursesicon from './seqta/icons/coursesIcon'; @@ -52,6 +51,7 @@ document.addEventListener( IsSEQTAPage = true; console.log('[BetterSEQTA+] Verified SEQTA Page'); + import('./css/injected.scss'); import('./css/documentload.scss'); /* const link = GetCSSElement(); document.getElementsByTagName('html')[0].appendChild(link); */ @@ -820,7 +820,7 @@ export function closeSettings() { } function addExtensionSettings() { - const link = GetCSSElement('interface/popup.css'); + const link = GetCSSElement('src/interface/popup.css'); document.querySelector('html')!.appendChild(link); const extensionPopup = document.createElement('div'); @@ -829,7 +829,7 @@ function addExtensionSettings() { document.body.appendChild(extensionPopup); const extensionIframe: HTMLIFrameElement = document.createElement('iframe'); - extensionIframe.src = `${browser.runtime.getURL('interface/index.html')}#settings/embedded`; + extensionIframe.src = `${browser.runtime.getURL('src/interface/index.html')}#settings/embedded`; extensionIframe.id = 'ExtensionIframe'; extensionIframe.setAttribute('allowTransparency', 'true'); extensionIframe.setAttribute('excludeDarkCheck', 'true'); diff --git a/src/css/documentload.js b/src/css/documentload.ts similarity index 100% rename from src/css/documentload.js rename to src/css/documentload.ts diff --git a/src/css/iframe.js b/src/css/iframe.ts similarity index 100% rename from src/css/iframe.js rename to src/css/iframe.ts diff --git a/src/css/injected.js b/src/css/injected.ts similarity index 100% rename from src/css/injected.js rename to src/css/injected.ts From 9490c9f8e203ffdd6838f1b5669f5a28d3fb702d Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Wed, 20 Dec 2023 13:47:36 +1100 Subject: [PATCH 16/46] fix minor errors --- src/SEQTA.ts | 68 +++++++++++++++++++++++++--------------------------- 1 file changed, 33 insertions(+), 35 deletions(-) diff --git a/src/SEQTA.ts b/src/SEQTA.ts index 714d0af5..c1cecdb0 100644 --- a/src/SEQTA.ts +++ b/src/SEQTA.ts @@ -1639,14 +1639,14 @@ function callHomeTimetable(date: string, change?: any) { }); } } else { - if (!DayContainer.innerText || change) { - DayContainer.innerText = ''; + if (DayContainer.innerHTML || change) { + DayContainer.innerHTML = ''; var dummyDay = document.createElement('div'); dummyDay.classList.add('day-empty'); let img = document.createElement('img'); img.src = browser.runtime.getURL('icons/betterseqta-light-icon.png'); let text = document.createElement('p'); - text.innerText = 'No lessons available.'; + text.innerHTML = 'No lessons available.'; dummyDay.append(img); dummyDay.append(text); DayContainer.append(dummyDay); @@ -2182,7 +2182,7 @@ async function SendHomePage() { main!.innerHTML = ''; const titlediv = document.getElementById('title')!.firstChild; - ((titlediv!) as HTMLElement).innerText = 'Home'; + ((titlediv!) as HTMLElement).innerHTML = 'Home'; (document.querySelector('link[rel*="icon"]')! as HTMLLinkElement).href = browser.runtime.getURL('icons/icon-48.png'); @@ -2514,40 +2514,38 @@ async function SendHomePage() { } result1.then(open1, onError) let activeClassList: any; - GetUpcomingAssessments().then((assessments) => { - GetActiveClasses().then((classes) => { - // Gets all subjects for the student - for (let i = 0; i < classes.length; i++) { - const element = classes[i]; - // eslint-disable-next-line - if (element.hasOwnProperty("active")) { // for some reason eslint gets mad, even though it works? - // Finds the active class list with the current subjects - activeClassList = classes[i]; - } - } - let activeSubjects = activeClassList.subjects; - - let activeSubjectCodes = []; - // Gets the code for each of the subjects and puts them in an array - let element; - for (let i = 0; i < activeSubjects.length; i++) { - element = activeSubjects[i]; - activeSubjectCodes.push(element.code); - } - let CurrentAssessments = []; - for (let i = 0; i < assessments.length; i++) { - element = assessments[i]; - if (activeSubjectCodes.includes(element.code)) { - CurrentAssessments.push(element); - } - } + const assessments = await GetUpcomingAssessments() + const classes = await GetActiveClasses() - CurrentAssessments.sort(comparedate); + // Gets all subjects for the student + for (let i = 0; i < classes.length; i++) { + const element = classes[i]; + // eslint-disable-next-line + if (element.hasOwnProperty("active")) { // for some reason eslint gets mad, even though it works? + // Finds the active class list with the current subjects + activeClassList = classes[i]; + } + } + let activeSubjects = activeClassList.subjects; - CreateUpcomingSection(CurrentAssessments, activeSubjects); - }); - }); + let activeSubjectCodes = []; + + // Gets the code for each of the subjects and puts them in an array + for (let i = 0; i < activeSubjects.length; i++) { + activeSubjectCodes.push(activeSubjects[i].code); + } + + let CurrentAssessments = []; + for (let i = 0; i < assessments.length; i++) { + if (activeSubjectCodes.includes(assessments[i].code)) { + CurrentAssessments.push(element); + } + } + + CurrentAssessments.sort(comparedate); + + CreateUpcomingSection(CurrentAssessments, activeSubjects); } export function addShortcuts(shortcuts: any) { From f30402de12152f2485f11f31e65031de62d24ead Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Wed, 20 Dec 2023 15:01:48 +1100 Subject: [PATCH 17/46] fix css not being applied to iframes --- src/SEQTA.ts | 108 +++++++++++++++++--------------------------- src/css/iframe.scss | 20 ++++---- 2 files changed, 53 insertions(+), 75 deletions(-) diff --git a/src/SEQTA.ts b/src/SEQTA.ts index c1cecdb0..fd170067 100644 --- a/src/SEQTA.ts +++ b/src/SEQTA.ts @@ -402,74 +402,47 @@ function removeThemeTagsFromNotices () { } } -function CheckiFrameItems() { - // Injecting CSS File to the webpage to overwrite iFrame default CSS - const fileref = document.createElement('link') - fileref.setAttribute('rel', 'stylesheet') - fileref.setAttribute('type', 'text/css') - fileref.innerHTML = iframeCSS - - const observer = new MutationObserver(function (mutations_list) { - mutations_list.forEach(function (mutation) { - mutation.addedNodes.forEach(function (added_node) { - const node = added_node as HTMLElement - if (node.tagName == 'IFRAME') { - const result = browser.storage.local.get('DarkMode') as Promise; - function open (result: any) { - DarkMode = result.DarkMode; - const node = added_node as HTMLIFrameElement - if (DarkMode) { - RunColourCheck(node); - const childNode = node.contentDocument!.documentElement.childNodes[1] as HTMLElement - if ( - childNode.style - .color != 'white' - ) { - childNode.style.color = - 'white'; - } - const innerHTMLNode = node.contentDocument!.documentElement.firstChild! as HTMLElement - if ( - !innerHTMLNode.innerHTML.includes( - 'iframe.css', - ) - ) { - innerHTMLNode.append( - fileref, - ); - } - node.addEventListener('load', function () { - const childNode = node.contentDocument!.documentElement.childNodes[1] as HTMLElement - const innerHTMLNode = node.contentDocument!.documentElement.firstChild! as HTMLElement - if ( - childNode.style - .color != 'white' - ) { - childNode.style.color = - 'white'; - } - if ( - !innerHTMLNode.innerHTML.includes( - 'iframe.css', - ) - ) { - innerHTMLNode.append( - fileref, - ); - } - }); +async function updateIframesWithDarkMode(): Promise { + // Load the CSS file to overwrite iFrame default CSS + const cssLink = document.createElement('style'); + const cssContent = document.createTextNode(iframeCSS); + cssLink.appendChild(cssContent); + + const observer = new MutationObserver(async (mutationsList) => { + for (const mutation of mutationsList) { + for (const node of mutation.addedNodes) { + if (node.nodeName === 'IFRAME') { + const iframe = node as HTMLIFrameElement; + try { + const settings = await browser.storage.local.get('DarkMode') as SettingsState; + if (settings.DarkMode) { + //await delay(1); + applyDarkModeToIframe(iframe, cssLink); } + } catch (error) { + console.error('Error applying dark mode:', error); } - result.then(open, onError) } - }); - }); + } + } }); - observer.observe(document.body, { - subtree: true, - childList: true, - }); + observer.observe(document.body, { subtree: true, childList: true }); +} + +function applyDarkModeToIframe(iframe: HTMLIFrameElement, cssLink: HTMLStyleElement): void { + const iframeDocument = iframe.contentDocument; + if (!iframeDocument) return; + + const body = iframeDocument.body; + if (body && body.style.color !== 'white') { + body.style.color = 'white'; + } + + const head = iframeDocument.head; + if (head && !head.innerHTML.includes('iframe.css')) { + head.appendChild(cssLink); + } } function SortMessagePageItems(messagesParentElement: any) { @@ -612,7 +585,7 @@ export function tryLoad() { document.addEventListener( 'load', function () { - CheckiFrameItems(); + updateIframesWithDarkMode(); removeThemeTagsFromNotices(); documentTextColor(); }, @@ -1639,14 +1612,15 @@ function callHomeTimetable(date: string, change?: any) { }); } } else { - if (DayContainer.innerHTML || change) { - DayContainer.innerHTML = ''; + console.log(DayContainer); + if (DayContainer.innerText || change) { + DayContainer.innerText = ''; var dummyDay = document.createElement('div'); dummyDay.classList.add('day-empty'); let img = document.createElement('img'); img.src = browser.runtime.getURL('icons/betterseqta-light-icon.png'); let text = document.createElement('p'); - text.innerHTML = 'No lessons available.'; + text.innerText = 'No lessons available.'; dummyDay.append(img); dummyDay.append(text); DayContainer.append(dummyDay); diff --git a/src/css/iframe.scss b/src/css/iframe.scss index fe69fde5..4069541d 100644 --- a/src/css/iframe.scss +++ b/src/css/iframe.scss @@ -26,14 +26,18 @@ body { blockquote.forward > .preamble { color: rgba(255, 255, 255, 0.7) !important; -} - -blockquote.forward > .preamble > .date > .value, blockquote.forward > .preamble > .sender > .value { - color: rgba(255, 255, 255, 0.7) !important; -} - -blockquote.forward > .preamble > .date > .label, blockquote.forward > .preamble > .sender > .label { - color: rgba(255, 255, 255, 0.7) !important; + + > .date > .value, blockquote.forward > .preamble > .sender > .value { + color: rgba(255, 255, 255, 0.7) !important; + } + + > .date > .label, blockquote.forward > .preamble > .sender > .label { + color: rgba(255, 255, 255, 0.7) !important; + } +} + +[bgcolor="#ffffff"] { + color: black; } table th { From 166802b1e9a4dff04c59b32ef5babfc315f24a43 Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Wed, 20 Dec 2023 15:03:14 +1100 Subject: [PATCH 18/46] removed unused function --- src/SEQTA.ts | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/SEQTA.ts b/src/SEQTA.ts index fd170067..47215d19 100644 --- a/src/SEQTA.ts +++ b/src/SEQTA.ts @@ -366,16 +366,6 @@ export function waitForElm(selector: any) { }); } -async function RunColourCheck(element: any) { - if ( - typeof element.contentDocument.documentElement.childNodes[1] == 'undefined' - ) { - await delay(1000); - RunColourCheck(element); - } else { - element.contentDocument.documentElement.childNodes[1].style.color = 'white'; - } -} export function GetCSSElement (file: string) { const cssFile = browser.runtime.getURL(file) const fileref = document.createElement('link') @@ -416,7 +406,6 @@ async function updateIframesWithDarkMode(): Promise { try { const settings = await browser.storage.local.get('DarkMode') as SettingsState; if (settings.DarkMode) { - //await delay(1); applyDarkModeToIframe(iframe, cssLink); } } catch (error) { From ca1d5b7a1c9608ab0c37c079d62efecf329aa3d2 Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Wed, 20 Dec 2023 15:10:31 +1100 Subject: [PATCH 19/46] remove unnecessary semicolons in SEQTA.ts --- src/SEQTA.ts | 1878 +++++++++++++++++++++++++------------------------- 1 file changed, 939 insertions(+), 939 deletions(-) diff --git a/src/SEQTA.ts b/src/SEQTA.ts index 47215d19..ee8c5b67 100644 --- a/src/SEQTA.ts +++ b/src/SEQTA.ts @@ -1,144 +1,144 @@ -import * as Sentry from "@sentry/browser"; - -import { animate, spring, stagger } from 'motion'; -import loading, { AppendLoadingSymbol } from './seqta/ui/Loading'; - -import Color from 'color'; -import MenuitemSVGKey from './seqta/content/MenuItemSVGKey.json'; -import { MessageHandler } from './seqta/utils/MessageListener'; -import { SettingsState } from "./types/storage"; -import ShortcutLinks from './seqta/content/links.json'; -import Sortable from 'sortablejs'; -import StorageListener from './seqta/utils/StorageListener'; -import { appendBackgroundToUI } from './seqta/ui/ImageBackgrounds'; -import assessmentsicon from './seqta/icons/assessmentsIcon'; -import browser from 'webextension-polyfill'; -import coursesicon from './seqta/icons/coursesIcon'; -import { delay } from "./seqta/utils/delay"; -import { enableCurrentTheme } from './seqta/ui/Themes'; -import iframeCSS from "./css/iframe.scss?inline"; -import { onError } from './seqta/utils/onError'; -import stringToHTML from './seqta/utils/stringToHTML'; -import { updateAllColors } from './seqta/ui/colors/Manager'; -import { updateBgDurations } from './seqta/ui/Animation'; +import * as Sentry from "@sentry/browser" + +import { animate, spring, stagger } from 'motion' +import loading, { AppendLoadingSymbol } from './seqta/ui/Loading' + +import Color from 'color' +import MenuitemSVGKey from './seqta/content/MenuItemSVGKey.json' +import { MessageHandler } from './seqta/utils/MessageListener' +import { SettingsState } from "./types/storage" +import ShortcutLinks from './seqta/content/links.json' +import Sortable from 'sortablejs' +import StorageListener from './seqta/utils/StorageListener' +import { appendBackgroundToUI } from './seqta/ui/ImageBackgrounds' +import assessmentsicon from './seqta/icons/assessmentsIcon' +import browser from 'webextension-polyfill' +import coursesicon from './seqta/icons/coursesIcon' +import { delay } from "./seqta/utils/delay" +import { enableCurrentTheme } from './seqta/ui/Themes' +import iframeCSS from "./css/iframe.scss?inline" +import { onError } from './seqta/utils/onError' +import stringToHTML from './seqta/utils/stringToHTML' +import { updateAllColors } from './seqta/ui/colors/Manager' +import { updateBgDurations } from './seqta/ui/Animation' declare global { interface Window { - chrome?: any; + chrome?: any } } -export let isChrome = window.chrome; -let SettingsClicked = false; -export let MenuOptionsOpen = false; -let UserInitalCode = ''; -let currentSelectedDate = new Date(); -let LessonInterval: any; -export let DarkMode: boolean; +export let isChrome = window.chrome +let SettingsClicked = false +export let MenuOptionsOpen = false +let UserInitalCode = '' +let currentSelectedDate = new Date() +let LessonInterval: any +export let DarkMode: boolean -var MenuItemMutation = false; -var NonSEQTAPage = false; -var IsSEQTAPage = false; +var MenuItemMutation = false +var NonSEQTAPage = false +var IsSEQTAPage = false document.addEventListener( 'load', async function () { - CheckForMenuList(); - const hasSEQTAText = document.childNodes[1].textContent?.includes('Copyright (c) SEQTA Software'); - const hasSEQTATitle = document.title.includes('SEQTA Learn'); + CheckForMenuList() + const hasSEQTAText = document.childNodes[1].textContent?.includes('Copyright (c) SEQTA Software') + const hasSEQTATitle = document.title.includes('SEQTA Learn') if (hasSEQTAText && hasSEQTATitle && !IsSEQTAPage) { - IsSEQTAPage = true; - console.log('[BetterSEQTA+] Verified SEQTA Page'); + IsSEQTAPage = true + console.log('[BetterSEQTA+] Verified SEQTA Page') - import('./css/injected.scss'); - import('./css/documentload.scss'); - /* const link = GetCSSElement(); + import('./css/injected.scss') + import('./css/documentload.scss') + /* const link = GetCSSElement() document.getElementsByTagName('html')[0].appendChild(link); */ - enableCurrentTheme(); + enableCurrentTheme() try { - const items = await browser.storage.local.get() as SettingsState; + const items = await browser.storage.local.get() as SettingsState - main(items); + main(items) } catch (error: any) { - onError(error); + onError(error) } } if (!hasSEQTAText && !NonSEQTAPage) { - NonSEQTAPage = true; + NonSEQTAPage = true } }, true, -); +) function SetDisplayNone(ElementName: string) { - return `li[data-key=${ElementName}]{display:var(--menuHidden) !important; transition: 1s;}`; + return `li[data-key=${ElementName}]{display:var(--menuHidden) !important; transition: 1s;}` } function animbkEnable(item: any) { if (item.animatedbk) { - CreateBackground(); + CreateBackground() } else { - RemoveBackground(); - document.getElementById('container')!.style.background = 'var(--background-secondary)'; + RemoveBackground() + document.getElementById('container')!.style.background = 'var(--background-secondary)' } } export async function HideMenuItems(): Promise { try { - const result = await browser.storage.local.get() as SettingsState; + const result = await browser.storage.local.get() as SettingsState - let stylesheetInnerText: string = ''; + let stylesheetInnerText: string = '' for (const [menuItem, { toggle }] of Object.entries(result.menuitems)) { if (!toggle) { - stylesheetInnerText += SetDisplayNone(menuItem); - console.log(`[BetterSEQTA+] Hiding ${menuItem} menu item`); + stylesheetInnerText += SetDisplayNone(menuItem) + console.log(`[BetterSEQTA+] Hiding ${menuItem} menu item`) } } - const menuItemStyle: HTMLStyleElement = document.createElement('style'); - menuItemStyle.innerText = stylesheetInnerText; - document.head.appendChild(menuItemStyle); + const menuItemStyle: HTMLStyleElement = document.createElement('style') + menuItemStyle.innerText = stylesheetInnerText + document.head.appendChild(menuItemStyle) } catch (error) { - console.error("An error occurred:", error); + console.error("An error occurred:", error) } } function OpenWhatsNewPopup() { - const background = document.createElement('div'); - background.id = 'whatsnewbk'; - background.classList.add('whatsnewBackground'); + const background = document.createElement('div') + background.id = 'whatsnewbk' + background.classList.add('whatsnewBackground') - const container = document.createElement('div'); - container.classList.add('whatsnewContainer'); + const container = document.createElement('div') + container.classList.add('whatsnewContainer') var header: any = stringToHTML(`

What's New

BetterSEQTA+ V${browser.runtime.getManifest().version}

-
`).firstChild; - - let imagecont = document.createElement('div'); - imagecont.classList.add('whatsnewImgContainer'); - let video = document.createElement('video'); - let source = document.createElement('source'); - source.setAttribute('src', browser.runtime.getURL('resources/update-video.mp4')); - source.setAttribute('type', 'video/mp4'); - video.autoplay = true; - video.muted = true; - video.loop = true; - video.appendChild(source); - video.classList.add('whatsnewImg'); - imagecont.appendChild(video); - - let textcontainer = document.createElement('div'); - textcontainer.classList.add('whatsnewTextContainer'); + `).firstChild + + let imagecont = document.createElement('div') + imagecont.classList.add('whatsnewImgContainer') + let video = document.createElement('video') + let source = document.createElement('source') + source.setAttribute('src', browser.runtime.getURL('resources/update-video.mp4')) + source.setAttribute('type', 'video/mp4') + video.autoplay = true + video.muted = true + video.loop = true + video.appendChild(source) + video.classList.add('whatsnewImg') + imagecont.appendChild(video) + + let textcontainer = document.createElement('div') + textcontainer.classList.add('whatsnewTextContainer') let textheader: any = stringToHTML( '

DESIGN OVERHAUL

', - ).firstChild; - textcontainer.append(textheader); + ).firstChild + textcontainer.append(textheader) let text = stringToHTML( String.raw` @@ -209,7 +209,7 @@ function OpenWhatsNewPopup() {
  • Found in the BetterSEQTA+ Settings menu, custom shortcuts can now be created with a name and URL of your choice.
  • `, - ).firstChild; + ).firstChild let footer = stringToHTML( String.raw` @@ -228,30 +228,30 @@ function OpenWhatsNewPopup() { - `).firstChild; + `).firstChild - let exitbutton = document.createElement('div'); - exitbutton.id = 'whatsnewclosebutton'; + let exitbutton = document.createElement('div') + exitbutton.id = 'whatsnewclosebutton' - container.append(header); - container.append(imagecont); - container.append(textcontainer); - container.append(text as ChildNode); - container.append(footer as ChildNode); - container.append(exitbutton); + container.append(header) + container.append(imagecont) + container.append(textcontainer) + container.append(text as ChildNode) + container.append(footer as ChildNode) + container.append(exitbutton) - background.append(container); + background.append(container) - document.getElementById('container')!.append(background); + document.getElementById('container')!.append(background) - let bkelement = document.getElementById('whatsnewbk'); - let popup = document.getElementsByClassName('whatsnewContainer')[0]; + let bkelement = document.getElementById('whatsnewbk') + let popup = document.getElementsByClassName('whatsnewContainer')[0] animate( [popup, bkelement as HTMLElement], { scale: [0, 1], opacity: [0, 1] }, { easing: spring({ stiffness: 220, damping: 18 }) } - ); + ) animate( '.whatsnewTextContainer *', @@ -261,109 +261,109 @@ function OpenWhatsNewPopup() { duration: 0.5, easing: [.22, .03, .26, 1] } - ); + ) - browser.storage.local.remove(['justupdated']); + browser.storage.local.remove(['justupdated']) bkelement!.addEventListener('click', function (event) { // Check if the click event originated from the element itself and not any of its children if (event.target === bkelement) { - DeleteWhatsNew(); + DeleteWhatsNew() } }); - var closeelement = document.getElementById('whatsnewclosebutton'); + var closeelement = document.getElementById('whatsnewclosebutton') closeelement!.addEventListener('click', function () { - DeleteWhatsNew(); - }); + DeleteWhatsNew() + }) } async function finishLoad() { try { - var loadingbk = document.getElementById('loading'); - loadingbk!.style.opacity = '0'; - await delay(501); - loadingbk!.remove(); + var loadingbk = document.getElementById('loading') + loadingbk!.style.opacity = '0' + await delay(501) + loadingbk!.remove() } catch (err) { - console.log(err); + console.log(err) } - const result = browser.storage.local.get(['justupdated']); + const result = browser.storage.local.get(['justupdated']) function open (result: any) { if (result.justupdated && !document.getElementById('whatsnewbk')) { - OpenWhatsNewPopup(); + OpenWhatsNewPopup() } } result.then(open, onError) } async function DeleteWhatsNew() { - const bkelement = document.getElementById('whatsnewbk'); - const popup = document.getElementsByClassName('whatsnewContainer')[0]; + const bkelement = document.getElementById('whatsnewbk') + const popup = document.getElementsByClassName('whatsnewContainer')[0] animate( [popup, bkelement!], { opacity: [1, 0], scale: [1, 0] }, { easing: [.22, .03, .26, 1] } ).finished.then(() => { - bkelement!.remove(); + bkelement!.remove() }); } export function CreateBackground() { - var bkCheck = document.getElementsByClassName('bg'); + var bkCheck = document.getElementsByClassName('bg') if (bkCheck.length !== 0) { - return; + return } // Creating and inserting 3 divs containing the background applied to the pages - var bklocation = document.getElementById('container'); - var menu = document.getElementById('menu'); - var bk = document.createElement('div'); - bk.classList.add('bg'); - - bklocation!.insertBefore(bk, menu); - - var bk2 = document.createElement('div'); - bk2.classList.add('bg'); - bk2.classList.add('bg2'); - bklocation!.insertBefore(bk2, menu); - - var bk3 = document.createElement('div'); - bk3.classList.add('bg'); - bk3.classList.add('bg3'); - bklocation!.insertBefore(bk3, menu); + var bklocation = document.getElementById('container') + var menu = document.getElementById('menu') + var bk = document.createElement('div') + bk.classList.add('bg') + + bklocation!.insertBefore(bk, menu) + + var bk2 = document.createElement('div') + bk2.classList.add('bg') + bk2.classList.add('bg2') + bklocation!.insertBefore(bk2, menu) + + var bk3 = document.createElement('div') + bk3.classList.add('bg') + bk3.classList.add('bg3') + bklocation!.insertBefore(bk3, menu) } export function RemoveBackground() { - var bk = document.getElementsByClassName('bg'); - var bk2 = document.getElementsByClassName('bg2'); - var bk3 = document.getElementsByClassName('bg3'); - - if (bk.length == 0 || bk2.length == 0 || bk3.length == 0) return; - bk[0].remove(); - bk2[0].remove(); - bk3[0].remove(); + var bk = document.getElementsByClassName('bg') + var bk2 = document.getElementsByClassName('bg2') + var bk3 = document.getElementsByClassName('bg3') + + if (bk.length == 0 || bk2.length == 0 || bk3.length == 0) return + bk[0].remove() + bk2[0].remove() + bk3[0].remove() } export function waitForElm(selector: any) { return new Promise((resolve) => { if (document.querySelector(selector)) { - return resolve(document.querySelector(selector)); + return resolve(document.querySelector(selector)) } const observer = new MutationObserver(() => { if (document.querySelector(selector)) { - resolve(document.querySelector(selector)); - observer.disconnect(); + resolve(document.querySelector(selector)) + observer.disconnect() } - }); + }) observer.observe(document.body, { childList: true, subtree: true, - }); - }); + }) + }) } export function GetCSSElement (file: string) { @@ -394,55 +394,55 @@ function removeThemeTagsFromNotices () { async function updateIframesWithDarkMode(): Promise { // Load the CSS file to overwrite iFrame default CSS - const cssLink = document.createElement('style'); - const cssContent = document.createTextNode(iframeCSS); - cssLink.appendChild(cssContent); + const cssLink = document.createElement('style') + const cssContent = document.createTextNode(iframeCSS) + cssLink.appendChild(cssContent) const observer = new MutationObserver(async (mutationsList) => { for (const mutation of mutationsList) { for (const node of mutation.addedNodes) { if (node.nodeName === 'IFRAME') { - const iframe = node as HTMLIFrameElement; + const iframe = node as HTMLIFrameElement try { - const settings = await browser.storage.local.get('DarkMode') as SettingsState; + const settings = await browser.storage.local.get('DarkMode') as SettingsState if (settings.DarkMode) { - applyDarkModeToIframe(iframe, cssLink); + applyDarkModeToIframe(iframe, cssLink) } } catch (error) { - console.error('Error applying dark mode:', error); + console.error('Error applying dark mode:', error) } } } } - }); + }) - observer.observe(document.body, { subtree: true, childList: true }); + observer.observe(document.body, { subtree: true, childList: true }) } function applyDarkModeToIframe(iframe: HTMLIFrameElement, cssLink: HTMLStyleElement): void { - const iframeDocument = iframe.contentDocument; - if (!iframeDocument) return; + const iframeDocument = iframe.contentDocument + if (!iframeDocument) return - const body = iframeDocument.body; + const body = iframeDocument.body if (body && body.style.color !== 'white') { - body.style.color = 'white'; + body.style.color = 'white' } - const head = iframeDocument.head; + const head = iframeDocument.head if (head && !head.innerHTML.includes('iframe.css')) { - head.appendChild(cssLink); + head.appendChild(cssLink) } } function SortMessagePageItems(messagesParentElement: any) { - let filterbutton = document.createElement('div'); - filterbutton.classList.add('messages-filterbutton'); - filterbutton.innerText = 'Filter'; + let filterbutton = document.createElement('div') + filterbutton.classList.add('messages-filterbutton') + filterbutton.innerText = 'Filter' let header = document.getElementsByClassName( 'MessageList__MessageList___3DxoC', - )[0].firstChild as HTMLElement; - header.append(filterbutton); + )[0].firstChild as HTMLElement + header.append(filterbutton) messagesParentElement /* const observer = new MutationObserver(function (mutations_list) { @@ -452,9 +452,9 @@ function SortMessagePageItems(messagesParentElement: any) { if (node.dataset.message) { // Check if added_node.firstChild.title is in block list } - }); - }); - }); + }) + }) + }) observer.observe(messagesParentElement, { subtree: true, @@ -463,42 +463,42 @@ function SortMessagePageItems(messagesParentElement: any) { } async function LoadPageElements(): Promise { - await AddBetterSEQTAElements(true); - const sublink: string | undefined = window.location.href.split('/')[4]; + await AddBetterSEQTAElements(true) + const sublink: string | undefined = window.location.href.split('/')[4] async function handleNewsPage(): Promise { - console.log('[BetterSEQTA+] Started Init'); - const settings: SettingsState = await browser.storage.local.get() as SettingsState; + console.log('[BetterSEQTA+] Started Init') + const settings: SettingsState = await browser.storage.local.get() as SettingsState if (settings.onoff) { - SendNewsPage(); - const notificationSettings: SettingsState = await browser.storage.local.get() as SettingsState; + SendNewsPage() + const notificationSettings: SettingsState = await browser.storage.local.get() as SettingsState if (notificationSettings.notificationcollector) { - enableNotificationCollector(); + enableNotificationCollector() } - finishLoad(); + finishLoad() } } async function handleDefault(): Promise { - finishLoad(); - const settings: SettingsState = await browser.storage.local.get() as SettingsState; + finishLoad() + const settings: SettingsState = await browser.storage.local.get() as SettingsState if (settings.notificationcollector) { - enableNotificationCollector(); + enableNotificationCollector() } } switch (sublink) { case 'news': - await handleNewsPage(); - break; + await handleNewsPage() + break case 'home': case undefined: - window.location.replace(`${location.origin}/#?page=/home`); - LoadInit(); - break; + window.location.replace(`${location.origin}/#?page=/home`) + LoadInit() + break default: - await handleDefault(); - break; + await handleDefault() + break } const observer = new MutationObserver(function (mutations_list) { @@ -506,110 +506,110 @@ async function LoadPageElements(): Promise { mutation.addedNodes.forEach(function (added_node) { const node = added_node as HTMLElement if (node.classList.contains('messages')) { - let element = document.getElementById('title')!.firstChild as HTMLElement; - element.innerText = 'Direct Messages'; - document.title = 'Direct Messages ― SEQTA Learn'; - SortMessagePageItems(added_node); + let element = document.getElementById('title')!.firstChild as HTMLElement + element.innerText = 'Direct Messages' + document.title = 'Direct Messages ― SEQTA Learn' + SortMessagePageItems(added_node) } else if (node.classList.contains('notices')) { - CheckNoticeTextColour(added_node); + CheckNoticeTextColour(added_node) } - }); - }); - }); + }) + }) + }) observer.observe(document.querySelector('#main') as HTMLElement, { subtree: false, childList: true, - }); + }) } function CheckNoticeTextColour(notice: any) { const observer = new MutationObserver(function (mutations_list) { mutations_list.forEach(function (mutation) { mutation.addedNodes.forEach(function (added_node) { - const node = added_node as HTMLElement; + const node = added_node as HTMLElement const result = browser.storage.local.get(['DarkMode']) function open (result: any) { - DarkMode = result.DarkMode; + DarkMode = result.DarkMode if (node.classList.contains('notice')) { - var hex = node.style.cssText.split(' ')[1]; + var hex = node.style.cssText.split(' ')[1] if (hex) { const hex1 = hex.slice(0,-1) - var threshold = GetThresholdOfColor(hex1); + var threshold = GetThresholdOfColor(hex1) if (DarkMode && threshold < 100) { - node.style.cssText = '--color: undefined;'; + node.style.cssText = '--color: undefined;' } } } } result.then(open, onError) - }); - }); - }); + }) + }) + }) observer.observe(notice, { subtree: true, childList: true, - }); + }) } export function tryLoad() { waitForElm('.login').then(() => { - finishLoad(); - }); + finishLoad() + }) waitForElm('.day-container').then(() => { - finishLoad(); - }); + finishLoad() + }) waitForElm('[data-key=welcome]').then((elm: any) => { - elm.classList.remove('active'); - }); + elm.classList.remove('active') + }) waitForElm('.code').then((elm: any) => { - if (!elm.innerText.includes('BetterSEQTA')) LoadPageElements(); - }); + if (!elm.innerText.includes('BetterSEQTA')) LoadPageElements() + }) // Waits for page to call on load, run scripts document.addEventListener( 'load', function () { - updateIframesWithDarkMode(); - removeThemeTagsFromNotices(); - documentTextColor(); + updateIframesWithDarkMode() + removeThemeTagsFromNotices() + documentTextColor() }, true, - ); + ) const observer = new MutationObserver(() => { documentTextColor() }) observer.observe(document!, { attributes: true, childList: true, subtree: true, attributeFilter: ['td'], }) } function ChangeMenuItemPositions(storage: any) { - let menuorder = storage; + let menuorder = storage - var menuList = document.querySelector('#menu')!.firstChild!.childNodes; + var menuList = document.querySelector('#menu')!.firstChild!.childNodes - let listorder = []; + let listorder = [] for (let i = 0; i < menuList.length; i++) { const menu = menuList[i] as HTMLElement - let a = menuorder.indexOf(menu.dataset.key); + let a = menuorder.indexOf(menu.dataset.key) - listorder.push(a); + listorder.push(a) } - var newArr = []; + var newArr = [] for (var i = 0; i < listorder.length; i++) { - newArr[listorder[i]] = menuList[i]; + newArr[listorder[i]] = menuList[i] } - let listItemsDOM = document.getElementById('menu')!.firstChild; + let listItemsDOM = document.getElementById('menu')!.firstChild for (let i = 0; i < newArr.length; i++) { - const element = newArr[i]; + const element = newArr[i] if (element) { const elem = element as HTMLElement - elem.setAttribute('data-checked', 'true'); - listItemsDOM!.appendChild(element); + elem.setAttribute('data-checked', 'true') + listItemsDOM!.appendChild(element) } } } @@ -617,7 +617,7 @@ function ChangeMenuItemPositions(storage: any) { export async function ObserveMenuItemPosition() { const result = browser.storage.local.get() function open (result: any) { - let menuorder = result.menuorder; + let menuorder = result.menuorder if (menuorder && result.onoff) { const observer = new MutationObserver(function (mutations_list) { mutations_list.forEach(function (mutation) { @@ -629,18 +629,18 @@ export async function ObserveMenuItemPosition() { ReplaceMenuSVG( node, MenuitemSVGKey[node.dataset.key as keyof typeof MenuitemSVGKey], - ); + ) } - ChangeMenuItemPositions(menuorder); + ChangeMenuItemPositions(menuorder) } - }); - }); - }); + }) + }) + }) observer.observe(document.querySelector('#menu')!.firstChild!, { subtree: true, childList: true, - }); + }) } } result.then(open, onError) @@ -649,7 +649,7 @@ export async function ObserveMenuItemPosition() { function main(storedSetting: SettingsState) { // Handle undefined onoff setting if (typeof storedSetting.onoff === 'undefined') { - browser.runtime.sendMessage({ type: 'setDefaultStorage' }); + browser.runtime.sendMessage({ type: 'setDefaultStorage' }) } if (storedSetting.telemetry && storedSetting.onoff) { @@ -667,219 +667,219 @@ function main(storedSetting: SettingsState) { // Session Replay replaysSessionSampleRate: 0.1, // This sets the sample rate at 10%. You may want to change it to 100% while in development and then sample at a lower rate in production. replaysOnErrorSampleRate: 1.0, // If you're not already sampling the entire session, change the sample rate to 100% when sampling sessions where errors occur. - }); + }) } const handleDisabled = () => { - waitForElm('.code').then(AppendElementsToDisabledPage); - }; + waitForElm('.code').then(AppendElementsToDisabledPage) + } if (storedSetting.DarkMode) { - console.log('[BetterSEQTA+] Enabled'); + console.log('[BetterSEQTA+] Enabled') if (DarkMode) { - document.documentElement.classList.add('dark'); + document.documentElement.classList.add('dark') } - updateAllColors(storedSetting); - loading(); - InjectCustomIcons(); - HideMenuItems(); - CheckLoadOnPeriods(); - tryLoad(); + updateAllColors(storedSetting) + loading() + InjectCustomIcons() + HideMenuItems() + CheckLoadOnPeriods() + tryLoad() - window.addEventListener('load', tryLoad); + window.addEventListener('load', tryLoad) } else { handleDisabled() - window.addEventListener('load', handleDisabled); + window.addEventListener('load', handleDisabled) } } function InjectCustomIcons() { - const fontURL = browser.runtime.getURL('fonts/IconFamily.woff'); + const fontURL = browser.runtime.getURL('fonts/IconFamily.woff') - const style = document.createElement('style'); - style.setAttribute('type', 'text/css'); + const style = document.createElement('style') + style.setAttribute('type', 'text/css') style.innerHTML = ` @font-face { - font-family: 'IconFamily'; - src: url('${fontURL}') format('woff'); - font-weight: normal; - font-style: normal; - }`; - document.head.appendChild(style); + font-family: 'IconFamily' + src: url('${fontURL}') format('woff') + font-weight: normal + font-style: normal + }` + document.head.appendChild(style) } export function AppendElementsToDisabledPage() { - AddBetterSEQTAElements(false); + AddBetterSEQTAElements(false) - let settingsStyle = document.createElement('style'); + let settingsStyle = document.createElement('style') settingsStyle.innerText = ` .addedButton { - position: absolute !important; - right: 50px; - width: 35px; - height: 35px; - padding: 6px !important; - overflow: unset !important; - border-radius: 50%; - margin: 7px !important; - cursor: pointer; - color: white !important; + position: absolute !important + right: 50px + width: 35px + height: 35px + padding: 6px !important + overflow: unset !important + border-radius: 50% + margin: 7px !important + cursor: pointer + color: white !important } .addedButton svg { - margin: 6px; + margin: 6px } .outside-container { - top: 48px !important; + top: 48px !important } #ExtensionPopup { - border-radius: 1rem; - box-shadow: 0px 0px 20px -2px rgba(0, 0, 0, 0.6); - transform-origin: 70% 0; + border-radius: 1rem + box-shadow: 0px 0px 20px -2px rgba(0, 0, 0, 0.6) + transform-origin: 70% 0 } - `; - document.head.append(settingsStyle); + ` + document.head.append(settingsStyle) } -new StorageListener(); -new MessageHandler(); +new StorageListener() +new MessageHandler() -var PageLoaded = false; +var PageLoaded = false async function CheckLoadOnPeriods() { if (!PageLoaded) { - await delay(1000); - var code = document.getElementsByClassName('code')[0]; + await delay(1000) + var code = document.getElementsByClassName('code')[0] if (code && !UserInitalCode) { - LoadPageElements(); - finishLoad(); - PageLoaded = true; + LoadPageElements() + finishLoad() + PageLoaded = true } if (!code) { - CheckLoadOnPeriods(); + CheckLoadOnPeriods() } } } export function closeSettings() { - const ExtensionSettings = document.getElementById('ExtensionPopup')!; - const ExtensionIframe = document.getElementById('ExtensionIframe') as HTMLIFrameElement; + const ExtensionSettings = document.getElementById('ExtensionPopup')! + const ExtensionIframe = document.getElementById('ExtensionIframe') as HTMLIFrameElement if (SettingsClicked == true) { - ExtensionSettings!.classList.add('hide'); + ExtensionSettings!.classList.add('hide') animate( '#ExtensionPopup', { opacity: [1, 0], scale: [1, 0] }, { easing: spring({ stiffness: 220, damping: 18 }) } - ); - SettingsClicked = false; + ) + SettingsClicked = false if (ExtensionIframe.contentWindow) { - ExtensionIframe.contentWindow.postMessage('popupClosed', '*'); + ExtensionIframe.contentWindow.postMessage('popupClosed', '*') } } - ExtensionSettings!.classList.add('hide'); + ExtensionSettings!.classList.add('hide') } function addExtensionSettings() { - const link = GetCSSElement('src/interface/popup.css'); - document.querySelector('html')!.appendChild(link); - - const extensionPopup = document.createElement('div'); - extensionPopup.classList.add('outside-container', 'hide'); - extensionPopup.id = 'ExtensionPopup'; - document.body.appendChild(extensionPopup); - - const extensionIframe: HTMLIFrameElement = document.createElement('iframe'); - extensionIframe.src = `${browser.runtime.getURL('src/interface/index.html')}#settings/embedded`; - extensionIframe.id = 'ExtensionIframe'; - extensionIframe.setAttribute('allowTransparency', 'true'); - extensionIframe.setAttribute('excludeDarkCheck', 'true'); - extensionIframe.style.width = '384px'; - extensionIframe.style.height = '600px'; - extensionIframe.style.border = 'none'; - extensionPopup.appendChild(extensionIframe); - - const container = document.getElementById('container'); + const link = GetCSSElement('src/interface/popup.css') + document.querySelector('html')!.appendChild(link) + + const extensionPopup = document.createElement('div') + extensionPopup.classList.add('outside-container', 'hide') + extensionPopup.id = 'ExtensionPopup' + document.body.appendChild(extensionPopup) + + const extensionIframe: HTMLIFrameElement = document.createElement('iframe') + extensionIframe.src = `${browser.runtime.getURL('src/interface/index.html')}#settings/embedded` + extensionIframe.id = 'ExtensionIframe' + extensionIframe.setAttribute('allowTransparency', 'true') + extensionIframe.setAttribute('excludeDarkCheck', 'true') + extensionIframe.style.width = '384px' + extensionIframe.style.height = '600px' + extensionIframe.style.border = 'none' + extensionPopup.appendChild(extensionIframe) + + const container = document.getElementById('container') const closeExtensionPopup = () => { - const ExtensionIframe = document.getElementById('ExtensionIframe') as HTMLIFrameElement; + const ExtensionIframe = document.getElementById('ExtensionIframe') as HTMLIFrameElement - extensionPopup.classList.add('hide'); + extensionPopup.classList.add('hide') animate( '#ExtensionPopup', { opacity: [1, 0], scale: [1, 0] }, { easing: [.22, .03, .26, 1] } - ); + ) if (ExtensionIframe.contentWindow) { - ExtensionIframe.contentWindow.postMessage('popupClosed', '*'); + ExtensionIframe.contentWindow.postMessage('popupClosed', '*') } - SettingsClicked = false; - }; + SettingsClicked = false + } container!.onclick = (event) => { if ((event.target as HTMLElement).closest('#AddedSettings') == null && SettingsClicked) { closeExtensionPopup() } - }; + } } export function OpenMenuOptions() { const result = browser.storage.local.get() function open (result: any) { - var container = document.getElementById('container'); - var menu = document.getElementById('menu'); + var container = document.getElementById('container') + var menu = document.getElementById('menu') if (result.defaultmenuorder.length == '0') { - let childnodes = menu!.firstChild!.childNodes; - let newdefaultmenuorder = []; + let childnodes = menu!.firstChild!.childNodes + let newdefaultmenuorder = [] for (let i = 0; i < childnodes.length; i++) { - const element = childnodes[i]; - newdefaultmenuorder.push((element as HTMLElement).dataset.key); - browser.storage.local.set({ defaultmenuorder: newdefaultmenuorder }); + const element = childnodes[i] + newdefaultmenuorder.push((element as HTMLElement).dataset.key) + browser.storage.local.set({ defaultmenuorder: newdefaultmenuorder }) } } - let childnodes = menu!.firstChild!.childNodes; + let childnodes = menu!.firstChild!.childNodes if (result.defaultmenuorder.length != childnodes.length) { for (let i = 0; i < childnodes.length; i++) { - const element = childnodes[i]; + const element = childnodes[i] if (!result.defaultmenuorder.indexOf((element as HTMLElement).dataset.key)) { - let newdefaultmenuorder = result.defaultmenuorder; - newdefaultmenuorder.push((element as HTMLElement).dataset.key); - browser.storage.local.set({ defaultmenuorder: newdefaultmenuorder }); + let newdefaultmenuorder = result.defaultmenuorder + newdefaultmenuorder.push((element as HTMLElement).dataset.key) + browser.storage.local.set({ defaultmenuorder: newdefaultmenuorder }) } } } - MenuOptionsOpen = true; + MenuOptionsOpen = true - let cover = document.createElement('div'); - cover.classList.add('notMenuCover'); - menu!.style.zIndex = '20'; - menu!.style.setProperty('--menuHidden', 'flex'); - container!.append(cover); + let cover = document.createElement('div') + cover.classList.add('notMenuCover') + menu!.style.zIndex = '20' + menu!.style.setProperty('--menuHidden', 'flex') + container!.append(cover) - let menusettings = document.createElement('div'); - menusettings.classList.add('editmenuoption-container'); + let menusettings = document.createElement('div') + menusettings.classList.add('editmenuoption-container') - let defaultbutton = document.createElement('div'); - defaultbutton.classList.add('editmenuoption'); - defaultbutton.innerText = 'Restore Default'; - defaultbutton.id = 'restoredefaultoption'; + let defaultbutton = document.createElement('div') + defaultbutton.classList.add('editmenuoption') + defaultbutton.innerText = 'Restore Default' + defaultbutton.id = 'restoredefaultoption' - let savebutton = document.createElement('div'); - savebutton.classList.add('editmenuoption'); - savebutton.innerText = 'Save'; - savebutton.id = 'restoredefaultoption'; + let savebutton = document.createElement('div') + savebutton.classList.add('editmenuoption') + savebutton.innerText = 'Save' + savebutton.id = 'restoredefaultoption' - menusettings.appendChild(defaultbutton); - menusettings.appendChild(savebutton); + menusettings.appendChild(defaultbutton) + menusettings.appendChild(savebutton) - menu!.appendChild(menusettings); + menu!.appendChild(menusettings) - let ListItems = menu!.firstChild!.childNodes; + let ListItems = menu!.firstChild!.childNodes for (let i = 0; i < ListItems.length; i++) { - const element1 = ListItems[i]; + const element1 = ListItems[i] const element = element1 as HTMLElement (element as HTMLElement).classList.add('draggable'); @@ -889,9 +889,9 @@ export function OpenMenuOptions() { } let MenuItemToggle = stringToHTML( - `
    `, + `
    ` ).firstChild; - (element as HTMLElement).append(MenuItemToggle!); + (element as HTMLElement).append(MenuItemToggle!) if (!element.dataset.betterseqta) { const a = document.createElement('section') @@ -903,98 +903,98 @@ export function OpenMenuOptions() { } if (Object.keys(result.menuitems).length == 0) { - menubuttons = menu!.firstChild!.childNodes; - var menuItems = {}; + menubuttons = menu!.firstChild!.childNodes + var menuItems = {} for (var i = 0; i < menubuttons.length; i++) { - var id = (menubuttons[i] as HTMLElement).dataset.key; - const element: any = {}; + var id = (menubuttons[i] as HTMLElement).dataset.key + const element: any = {} element.toggle = true; (menuItems[id as keyof typeof menuItems] as any) = element; } - browser.storage.local.set({ menuitems: menuItems }); + browser.storage.local.set({ menuitems: menuItems }) } - var menubuttons: any = document.getElementsByClassName('menuitem'); + var menubuttons: any = document.getElementsByClassName('menuitem') const result1 = browser.storage.local.get(['menuitems']) function open (result: any) { - var menuItems = result.menuitems; - let buttons = document.getElementsByClassName('menuitem'); + var menuItems = result.menuitems + let buttons = document.getElementsByClassName('menuitem') for (var i = 0; i < buttons.length; i++) { - var id = buttons[i].id; + var id = buttons[i].id if (menuItems[id]) { - (buttons[i] as HTMLInputElement).checked = menuItems[id].toggle; + (buttons[i] as HTMLInputElement).checked = menuItems[id].toggle } if (!menuItems[id]) { - (buttons[i] as HTMLInputElement).checked = true; + (buttons[i] as HTMLInputElement).checked = true } } } - result1.then(open, onError); + result1.then(open, onError) try { - var el = document.querySelector('#menu > ul'); + var el = document.querySelector('#menu > ul') var sortable = Sortable.create((el as HTMLElement), { draggable: '.draggable', dataIdAttr: 'data-key', animation: 150, easing: "cubic-bezier(.5,0,.5,1)", onEnd: function () { - saveNewOrder(sortable); + saveNewOrder(sortable) }, }); } catch (err) { - console.log(err); + console.log(err) } function changeDisplayProperty(element: any) { if (!element.checked) { - element.parentNode.parentNode.style.display = 'var(--menuHidden)'; + element.parentNode.parentNode.style.display = 'var(--menuHidden)' } if (element.checked) { element.parentNode.parentNode.style.setProperty( 'display', 'flex', 'important', - ); + ) } } function StoreMenuSettings() { - const menuItems: any = {}; + const menuItems: any = {} const menubuttons = menu!.firstChild!.childNodes const button = document.getElementsByClassName('menuitem') for (let i = 0; i < menubuttons.length; i++) { - const id = (menubuttons[i] as HTMLElement).dataset.key; - const element: any = {}; + const id = (menubuttons[i] as HTMLElement).dataset.key + const element: any = {} element.toggle = (button[i] as HTMLInputElement).checked - menuItems[id as keyof typeof menuItems] = element; + menuItems[id as keyof typeof menuItems] = element } browser.storage.local.set({ menuitems: menuItems }) } for (let i = 0; i < menubuttons.length; i++) { - const element = menubuttons[i]; + const element = menubuttons[i] element.addEventListener('change', () => { - element.parentElement.parentElement.getAttribute('data-key'); - StoreMenuSettings(); - changeDisplayProperty(element); - }); + element.parentElement.parentElement.getAttribute('data-key') + StoreMenuSettings() + changeDisplayProperty(element) + }) } function closeAll() { - console.log("Closing!"); - ListItems = menu!.firstChild!.childNodes; - menusettings.remove(); - cover.remove(); - MenuOptionsOpen = false; - menu!.style.setProperty('--menuHidden', 'none'); + console.log("Closing!") + ListItems = menu!.firstChild!.childNodes + menusettings.remove() + cover.remove() + MenuOptionsOpen = false + menu!.style.setProperty('--menuHidden', 'none') for (let i = 0; i < ListItems.length; i++) { - const element1 = ListItems[i]; + const element1 = ListItems[i] const element = element1 as HTMLElement - element.classList.remove('draggable'); - element.setAttribute('draggable', 'false'); + element.classList.remove('draggable') + element.setAttribute('draggable', 'false') if (!element.dataset.betterseqta) { @@ -1006,107 +1006,107 @@ export function OpenMenuOptions() { } } - let switches = menu!.querySelectorAll('.onoffswitch'); + let switches = menu!.querySelectorAll('.onoffswitch') for (let i = 0; i < switches.length; i++) { - switches[i].remove(); + switches[i].remove() } } - cover.addEventListener('click', closeAll); - savebutton.addEventListener('click', closeAll); + cover.addEventListener('click', closeAll) + savebutton.addEventListener('click', closeAll) defaultbutton.addEventListener('click', function () { const result = browser.storage.local.get() function open (response: any) { - const options = response.defaultmenuorder; - browser.storage.local.set({ menuorder: options }); - ChangeMenuItemPositions(options); + const options = response.defaultmenuorder + browser.storage.local.set({ menuorder: options }) + ChangeMenuItemPositions(options) for (let i = 0; i < menubuttons.length; i++) { - const element = menubuttons[i]; - element.checked = true; + const element = menubuttons[i] + element.checked = true element.parentNode.parentNode.style.setProperty( 'display', 'flex', 'important', - ); + ) } - saveNewOrder(sortable); + saveNewOrder(sortable) } result.then(open, onError) - }); + }) } result.then(open, onError) } function saveNewOrder(sortable: any) { - var order = sortable.toArray(); - browser.storage.local.set({ menuorder: order }); + var order = sortable.toArray() + browser.storage.local.set({ menuorder: order }) } function cloneAttributes(target: any, source: any) { [...source.attributes].forEach((attr) => { - target.setAttribute(attr.nodeName, attr.nodeValue); - }); + target.setAttribute(attr.nodeName, attr.nodeValue) + }) } function ReplaceMenuSVG(element: HTMLElement, svg: string) { - let item = element.firstChild as HTMLElement; - item!.firstChild!.remove(); + let item = element.firstChild as HTMLElement + item!.firstChild!.remove() if (element.dataset.key == 'messages') { - (element!.firstChild! as HTMLElement).innerText! = 'Direct Messages'; + (element!.firstChild! as HTMLElement).innerText! = 'Direct Messages' } - let newsvg = stringToHTML(svg).firstChild; - item.insertBefore((newsvg as Node), item.firstChild); + let newsvg = stringToHTML(svg).firstChild + item.insertBefore((newsvg as Node), item.firstChild) } async function AddBetterSEQTAElements(toggle: any) { - const code = document.getElementsByClassName('code')[0]; + const code = document.getElementsByClassName('code')[0] // Replaces students code with the version of BetterSEQTA if (code != null) { if (!code.innerHTML.includes('BetterSEQTA')) { - UserInitalCode = code.innerHTML; - code.innerHTML = `BetterSEQTA v${browser.runtime.getManifest().version}`; - code.setAttribute('data-hover', 'Click for user code'); + UserInitalCode = code.innerHTML + code.innerHTML = `BetterSEQTA v${browser.runtime.getManifest().version}` + code.setAttribute('data-hover', 'Click for user code') code.addEventListener('click', function () { - var code = document.getElementsByClassName('code')[0]; + var code = document.getElementsByClassName('code')[0] if (code.innerHTML.includes('BetterSEQTA')) { - code.innerHTML = UserInitalCode; - code.setAttribute('data-hover', 'Click for BetterSEQTA version'); + code.innerHTML = UserInitalCode + code.setAttribute('data-hover', 'Click for BetterSEQTA version') } else { code.innerHTML = `BetterSEQTA v${ browser.runtime.getManifest().version - }`; - code.setAttribute('data-hover', 'Click for user code'); + }` + code.setAttribute('data-hover', 'Click for user code') } - }); + }) if (toggle) { // Creates Home menu button and appends it as the first child of the list - const result = await browser.storage.local.get(); + const result = await browser.storage.local.get() - animbkEnable(result); - updateBgDurations(result); + animbkEnable(result) + updateBgDurations(result) - DarkMode = result.DarkMode; + DarkMode = result.DarkMode if (DarkMode) { - document.documentElement.classList.add('dark'); + document.documentElement.classList.add('dark') } - const container = document.getElementById('content')!; + const container = document.getElementById('content')! const div = document.createElement('div') - div.classList.add('titlebar'); - container.append(div); - const NewButton = stringToHTML('
  • '); + div.classList.add('titlebar') + container.append(div) + const NewButton = stringToHTML('
  • ') - const menu = document.getElementById('menu')!; - const List = menu.firstChild! as HTMLElement; + const menu = document.getElementById('menu')! + const List = menu.firstChild! as HTMLElement if (NewButton.firstChild) { - List.insertBefore(NewButton.firstChild, List.firstChild); + List.insertBefore(NewButton.firstChild, List.firstChild) } try { @@ -1121,25 +1121,25 @@ async function AddBetterSEQTAElements(toggle: any) { query: null, redirect_url: location.origin, }), - }); + }) // Parse the JSON response and wait for it - const responseData = await response.json(); - let info = responseData.payload; + const responseData = await response.json() + let info = responseData.payload // Manipulate the DOM as needed - const titlebar = document.getElementsByClassName('titlebar')[0]; + const titlebar = document.getElementsByClassName('titlebar')[0] const userInfo = stringToHTML( '
    ', - ).firstChild; - titlebar.append(userInfo!); + ).firstChild + titlebar.append(userInfo!) - const userinfo = stringToHTML(`

    ${info.userDesc}

    ${UserInitalCode}

    `).firstChild; - titlebar.append(userinfo!); + const userinfo = stringToHTML(`

    ${info.userDesc}

    ${UserInitalCode}

    `).firstChild + titlebar.append(userinfo!) - var logoutbutton = document.getElementsByClassName('logout')[0]; - var userInfosvgdiv = document.getElementById('logouttooltip')!; - userInfosvgdiv.appendChild(logoutbutton); + var logoutbutton = document.getElementsByClassName('logout')[0] + var userInfosvgdiv = document.getElementById('logouttooltip')! + userInfosvgdiv.appendChild(logoutbutton) // Await the fetch response const peopleResponse = await fetch(`${location.origin}/seqta/student/load/message/people`, { @@ -1148,211 +1148,211 @@ async function AddBetterSEQTAElements(toggle: any) { 'Content-Type': 'application/json; charset=utf-8', }, body: JSON.stringify({ mode: 'student' }), - }); + }) // Await the JSON parsing of the response - const peopleResponseData = await peopleResponse.json(); - let students = peopleResponseData.payload; + const peopleResponseData = await peopleResponse.json() + let students = peopleResponseData.payload // Process the students data var index = students.findIndex(function (person: any) { return ( person.firstname == info.userDesc.split(' ')[0] && person.surname == info.userDesc.split(' ')[1] - ); - }); + ) + }) - let houseelement1 = document.getElementsByClassName('userInfohouse')[0]; + let houseelement1 = document.getElementsByClassName('userInfohouse')[0] const houseelement = houseelement1 as HTMLElement if (students[index]?.house) { - (houseelement as HTMLElement).style.background = students[index].house_colour; + (houseelement as HTMLElement).style.background = students[index].house_colour try { - let colorresult = GetThresholdOfColor(students[index]?.house_colour); + let colorresult = GetThresholdOfColor(students[index]?.house_colour) - houseelement.style.color = colorresult && colorresult > 300 ? 'black' : 'white'; - houseelement.innerText = students[index].year + students[index].house; + houseelement.style.color = colorresult && colorresult > 300 ? 'black' : 'white' + houseelement.innerText = students[index].year + students[index].house } catch (error) { - houseelement.innerText = students[index].house; + houseelement.innerText = students[index].house } } else { - houseelement.innerText = students[index].year; + houseelement.innerText = students[index].year } } catch (error) { - console.error('Error fetching and processing student data:', error); + console.error('Error fetching and processing student data:', error) } - const NewsButtonStr = '
  • '; - const NewsButton = stringToHTML(NewsButtonStr); - List!.appendChild(NewsButton.firstChild!); + const NewsButtonStr = '
  • ' + const NewsButton = stringToHTML(NewsButtonStr) + List!.appendChild(NewsButton.firstChild!) - let a = document.createElement('div'); - a.classList.add('icon-cover'); - a.id = 'icon-cover'; - menu!.appendChild(a); + let a = document.createElement('div') + a.classList.add('icon-cover') + a.id = 'icon-cover' + menu!.appendChild(a) - const menuCover = document.querySelector('#icon-cover'); + const menuCover = document.querySelector('#icon-cover') menuCover!.addEventListener('click', function () { - location.href = '../#?page=/home'; + location.href = '../#?page=/home' SendHomePage(); (document! .getElementById('menu')! - .firstChild! as HTMLElement).classList.remove('noscroll'); - }); + .firstChild! as HTMLElement).classList.remove('noscroll') + }) // Creates the home container when the menu button is pressed - const homebutton = document.getElementById('homebutton'); + const homebutton = document.getElementById('homebutton') homebutton!.addEventListener('click', function () { if (!MenuOptionsOpen) { - SendHomePage(); + SendHomePage() } - }); + }) // Creates the news container when the menu button is pressed - const newsbutton = document.getElementById('newsbutton'); + const newsbutton = document.getElementById('newsbutton') newsbutton!.addEventListener('click', function () { if (!MenuOptionsOpen) { - SendNewsPage(); + SendNewsPage() } - }); + }) } - appendBackgroundToUI(); - addExtensionSettings(); + appendBackgroundToUI() + addExtensionSettings() // If betterSEQTA+ is enabled, run the code if (toggle) { // Creates settings and dashboard buttons next to alerts let SettingsButton = stringToHTML( '', - ); - let ContentDiv = document.getElementById('content'); - ContentDiv!.append(SettingsButton.firstChild!); + ) + let ContentDiv = document.getElementById('content') + ContentDiv!.append(SettingsButton.firstChild!) const result: any = await new Promise(resolve => { - const result = browser.storage.local.get(); + const result = browser.storage.local.get() result.then(resolve, onError) - }); + }) - const DarkMode = result!.DarkMode; - const tooltipString = GetLightDarkModeString(DarkMode); + const DarkMode = result!.DarkMode + const tooltipString = GetLightDarkModeString(DarkMode) const svgContent = DarkMode ? '' : - ''; + '' const LightDarkModeButton = stringToHTML(` - `); + `) - ContentDiv!.append(LightDarkModeButton.firstChild!); + ContentDiv!.append(LightDarkModeButton.firstChild!) - updateAllColors(DarkMode, result.selectedColor); + updateAllColors(DarkMode, result.selectedColor) document.getElementById('LightDarkModeButton')!.addEventListener('click', async () => { const result: any = await new Promise(resolve => { - const result = browser.storage.local.get(); + const result = browser.storage.local.get() result.then(resolve, onError) - }); + }) - const newDarkMode = !result!.DarkMode; - browser.storage.local.set({ DarkMode: newDarkMode }); + const newDarkMode = !result!.DarkMode + browser.storage.local.set({ DarkMode: newDarkMode }) - updateAllColors(newDarkMode, result.selectedColor); + updateAllColors(newDarkMode, result.selectedColor) - const darklightText = document.getElementById('darklighttooliptext'); - darklightText!.innerText = GetLightDarkModeString(newDarkMode); - }); + const darklightText = document.getElementById('darklighttooliptext') + darklightText!.innerText = GetLightDarkModeString(newDarkMode) + }) // Locate the menuToggle element - const menuToggle = document.getElementById('menuToggle'); - menuToggle!.innerHTML = ''; + const menuToggle = document.getElementById('menuToggle') + menuToggle!.innerHTML = '' // Create three divs to act as lines of the hamburger icon for (let i = 0; i < 3; i++) { - const line = document.createElement('div'); - line.className = 'hamburger-line'; - menuToggle!.appendChild(line); + const line = document.createElement('div') + line.className = 'hamburger-line' + menuToggle!.appendChild(line) } } else { // Creates settings and dashboard buttons next to alerts let SettingsButton = stringToHTML( '', - ); - let ContentDiv = document.getElementById('content'); - ContentDiv!.append(SettingsButton.firstChild!); + ) + let ContentDiv = document.getElementById('content') + ContentDiv!.append(SettingsButton.firstChild!) } - var AddedSettings = document.getElementById('AddedSettings'); - var extensionPopup = document.getElementById('ExtensionPopup'); + var AddedSettings = document.getElementById('AddedSettings') + var extensionPopup = document.getElementById('ExtensionPopup') AddedSettings!.addEventListener('click', function () { if (SettingsClicked) { - extensionPopup!.classList.add('hide'); + extensionPopup!.classList.add('hide') animate( '#ExtensionPopup', { opacity: [1, 0], scale: [1, 0] }, { easing: spring({ stiffness: 220, damping: 18 }) } ); - (document.getElementById('ExtensionIframe')! as HTMLIFrameElement).contentWindow!.postMessage('popupClosed', '*'); + (document.getElementById('ExtensionIframe')! as HTMLIFrameElement).contentWindow!.postMessage('popupClosed', '*') SettingsClicked = false; } else { - extensionPopup!.classList.remove('hide'); + extensionPopup!.classList.remove('hide') animate( '#ExtensionPopup', { opacity: [0, 1], scale: [0, 1] }, { easing: spring({ stiffness: 260, damping: 24 }) } ) - SettingsClicked = true; + SettingsClicked = true } - }); + }) } } } function GetLightDarkModeString(darkmodetoggle: boolean) { - let tooltipstring; + let tooltipstring if (darkmodetoggle) { - tooltipstring = 'Switch to light theme'; + tooltipstring = 'Switch to light theme' } else { - tooltipstring = 'Switch to dark theme'; + tooltipstring = 'Switch to dark theme' } - return tooltipstring; + return tooltipstring } function CheckCurrentLesson(lesson: any, num: number) { - var startTime = lesson.from; - var endTime = lesson.until; + var startTime = lesson.from + var endTime = lesson.until // Gets current time - let currentDate = new Date(); + let currentDate = new Date() // Takes start time of current lesson and makes it into a Date function for comparison - let startDate = new Date(currentDate.getTime()); - startDate.setHours(startTime.split(':')[0]); - startDate.setMinutes(startTime.split(':')[1]); - startDate.setSeconds(parseInt('00')); + let startDate = new Date(currentDate.getTime()) + startDate.setHours(startTime.split(':')[0]) + startDate.setMinutes(startTime.split(':')[1]) + startDate.setSeconds(parseInt('00')) // Takes end time of current lesson and makes it into a Date function for comparison - let endDate = new Date(currentDate.getTime()); - endDate.setHours(endTime.split(':')[0]); - endDate.setMinutes(endTime.split(':')[1]); - endDate.setSeconds(parseInt('00')); + let endDate = new Date(currentDate.getTime()) + endDate.setHours(endTime.split(':')[0]) + endDate.setMinutes(endTime.split(':')[1]) + endDate.setSeconds(parseInt('00')) // Gets the difference between the start time and current time - var difference = startDate.getTime() - currentDate.getTime(); + var difference = startDate.getTime() - currentDate.getTime() // Converts the difference into minutes - var minutes = Math.floor(difference / 1000 / 60); + var minutes = Math.floor(difference / 1000 / 60) // Checks if current time is between the start time and end time of current tested lesson - let valid = startDate < currentDate && endDate > currentDate; + let valid = startDate < currentDate && endDate > currentDate - let id = lesson.code + num; - const date = new Date(); + let id = lesson.code + num + const date = new Date() - var elementA = document.getElementById(id); + var elementA = document.getElementById(id) if (!elementA) { - clearInterval(LessonInterval); + clearInterval(LessonInterval) } else { if ( currentSelectedDate.toLocaleDateString('en-au') == @@ -1360,11 +1360,11 @@ function CheckCurrentLesson(lesson: any, num: number) { ) { if (valid) { // Apply the activelesson class to increase the box-shadow of current lesson - elementA.classList.add('activelesson'); + elementA.classList.add('activelesson') } else { // Removes the activelesson class to ensure only the active lesson have the class if (elementA != null) { - elementA.classList.remove('activelesson'); + elementA.classList.remove('activelesson') } } } @@ -1377,7 +1377,7 @@ function CheckCurrentLesson(lesson: any, num: number) { if (result.lessonalert) { // Checks if notifications are supported if (!window.Notification) { - console.log('Browser does not support notifications.'); + console.log('Browser does not support notifications.') } else { // check if permission is already granted if (Notification.permission === 'granted') { @@ -1389,7 +1389,7 @@ function CheckCurrentLesson(lesson: any, num: number) { lesson.room + ' \nTeacher: ' + lesson.staff, - }); + }) } else { // request permission from user Notification.requestPermission() @@ -1404,14 +1404,14 @@ function CheckCurrentLesson(lesson: any, num: number) { lesson.room + ' \nTeacher: ' + lesson.staff, - }); + }) } else { - console.log('User blocked notifications.'); + console.log('User blocked notifications.') } }) .catch(function (err) { - console.error(err); - }); + console.error(err) + }) } } } @@ -1422,35 +1422,35 @@ function CheckCurrentLesson(lesson: any, num: number) { export function GetThresholdOfColor(color: any) { // Case-insensitive regular expression for matching RGBA colors - const rgbaRegex = /rgba?\(([^)]+)\)/gi; + const rgbaRegex = /rgba?\(([^)]+)\)/gi // Check if the color string is a gradient (linear or radial) if (color.includes('gradient')) { - let gradientThresholds = []; + let gradientThresholds = [] // Find and replace all instances of RGBA in the gradient - let match; + let match while ((match = rgbaRegex.exec(color)) !== null) { // Extract the individual components (r, g, b, a) - const rgbaString = match[1]; - const [r, g, b] = rgbaString.split(',').map(str => str.trim()); + const rgbaString = match[1] + const [r, g, b] = rgbaString.split(',').map(str => str.trim()) // Compute the threshold using your existing algorithm - const threshold = Math.sqrt(parseInt(r) ** 2 + parseInt(g) ** 2 + parseInt(b) ** 2); + const threshold = Math.sqrt(parseInt(r) ** 2 + parseInt(g) ** 2 + parseInt(b) ** 2) // Store the computed threshold - gradientThresholds.push(threshold); + gradientThresholds.push(threshold) } // Calculate the average threshold - const averageThreshold = gradientThresholds.reduce((acc, val) => acc + val, 0) / gradientThresholds.length; + const averageThreshold = gradientThresholds.reduce((acc, val) => acc + val, 0) / gradientThresholds.length - return averageThreshold; + return averageThreshold } else { // Handle the color as a simple RGBA (or hex, or whatever the Color library supports) - const rgb = Color.rgb(color).object(); - return Math.sqrt(rgb.r ** 2 + rgb.g ** 2 + rgb.b ** 2); + const rgb = Color.rgb(color).object() + return Math.sqrt(rgb.r ** 2 + rgb.g ** 2 + rgb.b ** 2) } } @@ -1459,24 +1459,24 @@ function CheckCurrentLessonAll(lessons: any) { LessonInterval = setInterval( function () { for (let i = 0; i < lessons.length; i++) { - CheckCurrentLesson(lessons[i], i + 1); + CheckCurrentLesson(lessons[i], i + 1) } }.bind(lessons), 60000, - ); + ) } // Helper function to build the assessment URL function buildAssessmentURL(programmeID: any, metaID: any, itemID = '') { - const base = '../#?page=/assessments/'; - return itemID ? `${base}${programmeID}:${metaID}&item=${itemID}` : `${base}${programmeID}:${metaID}`; + const base = '../#?page=/assessments/' + return itemID ? `${base}${programmeID}:${metaID}&item=${itemID}` : `${base}${programmeID}:${metaID}` } // Function to create a lesson div element from a lesson object function makeLessonDiv(lesson: any, num: number) { - if (!lesson) throw new Error('No lesson provided.'); + if (!lesson) throw new Error('No lesson provided.') - const { code, colour, description, staff, room, from, until, attendanceTitle, programmeID, metaID, assessments } = lesson; + const { code, colour, description, staff, room, from, until, attendanceTitle, programmeID, metaID, assessments } = lesson // Construct the base lesson string with default values using ternary operators let lessonString = ` @@ -1486,21 +1486,21 @@ function makeLessonDiv(lesson: any, num: number) {

    ${room || 'Unknown'}

    ${from || 'Unknown'} - ${until || 'Unknown'}

    ${attendanceTitle || 'Unknown'}
    - `; + ` // Add buttons for assessments and courses if applicable if (programmeID !== 0) { lessonString += `
    ${assessmentsicon}
    ${coursesicon}
    - `; + ` } // Add assessments if they exist if (assessments && assessments.length > 0) { const assessmentString = assessments.map((element: any) => `

    ${element.title}

    ` - ).join(''); + ).join('') lessonString += `
    @@ -1509,114 +1509,114 @@ function makeLessonDiv(lesson: any, num: number) {
    ${assessmentString}
    - `; + ` } - lessonString += '
    '; + lessonString += '
    ' - return stringToHTML(lessonString); + return stringToHTML(lessonString) } function CheckUnmarkedAttendance(lessonattendance: any) { if (lessonattendance) { - var lesson = lessonattendance.label; + var lesson = lessonattendance.label } else { - lesson = ' '; + lesson = ' ' } - return lesson; + return lesson } function callHomeTimetable(date: string, change?: any) { // Creates a HTTP Post Request to the SEQTA page for the students timetable - var xhr = new XMLHttpRequest(); - xhr.open('POST', `${location.origin}/seqta/student/load/timetable?`, true); + var xhr = new XMLHttpRequest() + xhr.open('POST', `${location.origin}/seqta/student/load/timetable?`, true) // Sets the response type to json - xhr.setRequestHeader('Content-Type', 'application/json; charset=utf-8'); + xhr.setRequestHeader('Content-Type', 'application/json; charset=utf-8') xhr.onreadystatechange = function () { // Once the response is ready if (xhr.readyState === 4) { - var serverResponse = JSON.parse(xhr.response); - let lessonArray: Array = []; - const DayContainer = document.getElementById('day-container')!; + var serverResponse = JSON.parse(xhr.response) + let lessonArray: Array = [] + const DayContainer = document.getElementById('day-container')! // If items in response: if (serverResponse.payload.items.length > 0) { if (DayContainer.innerText || change) { for (let i = 0; i < serverResponse.payload.items.length; i++) { - lessonArray.push(serverResponse.payload.items[i]); + lessonArray.push(serverResponse.payload.items[i]) } lessonArray.sort(function (a, b) { - return a.from.localeCompare(b.from); - }); + return a.from.localeCompare(b.from) + }) // If items in the response, set each corresponding value into divs // lessonArray = lessonArray.splice(1) GetLessonColours().then((colours) => { - let subjects = colours; + let subjects = colours for (let i = 0; i < lessonArray.length; i++) { - let subjectname = `timetable.subject.colour.${lessonArray[i].code}`; + let subjectname = `timetable.subject.colour.${lessonArray[i].code}` let subject = subjects.find( (element: any) => element.name === subjectname, - ); + ) if (!subject) { - lessonArray[i].colour = '--item-colour: #8e8e8e;'; + lessonArray[i].colour = '--item-colour: #8e8e8e;' } else { - lessonArray[i].colour = `--item-colour: ${subject.value};`; - let result = GetThresholdOfColor(subject.value); + lessonArray[i].colour = `--item-colour: ${subject.value};` + let result = GetThresholdOfColor(subject.value) if (result > 300) { - lessonArray[i].invert = true; + lessonArray[i].invert = true } } // Removes seconds from the start and end times - lessonArray[i].from = lessonArray[i].from.substring(0, 5); - lessonArray[i].until = lessonArray[i].until.substring(0, 5); + lessonArray[i].from = lessonArray[i].from.substring(0, 5) + lessonArray[i].until = lessonArray[i].until.substring(0, 5) // Checks if attendance is unmarked, and sets the string to " ". lessonArray[i].attendanceTitle = CheckUnmarkedAttendance( lessonArray[i].attendance, - ); + ) } // If on home page, apply each lesson to HTML with information in each div - DayContainer.innerText = ''; + DayContainer.innerText = '' for (let i = 0; i < lessonArray.length; i++) { - var div = makeLessonDiv(lessonArray[i], i + 1); + var div = makeLessonDiv(lessonArray[i], i + 1) // Append each of the lessons into the day-container if (lessonArray[i].invert) { const div1 = div.firstChild! as HTMLElement - div1.classList.add('day-inverted'); + div1.classList.add('day-inverted') } - DayContainer.append(div.firstChild as HTMLElement); + DayContainer.append(div.firstChild as HTMLElement) } - const today = new Date(); + const today = new Date() if (currentSelectedDate.getDate() == today.getDate()) { for (let i = 0; i < lessonArray.length; i++) { - CheckCurrentLesson(lessonArray[i], i + 1); + CheckCurrentLesson(lessonArray[i], i + 1) } // For each lesson, check the start and end times - CheckCurrentLessonAll(lessonArray); + CheckCurrentLessonAll(lessonArray) } - }); + }) } } else { - console.log(DayContainer); + console.log(DayContainer) if (DayContainer.innerText || change) { - DayContainer.innerText = ''; - var dummyDay = document.createElement('div'); - dummyDay.classList.add('day-empty'); - let img = document.createElement('img'); - img.src = browser.runtime.getURL('icons/betterseqta-light-icon.png'); - let text = document.createElement('p'); - text.innerText = 'No lessons available.'; - dummyDay.append(img); - dummyDay.append(text); - DayContainer.append(dummyDay); + DayContainer.innerText = '' + var dummyDay = document.createElement('div') + dummyDay.classList.add('day-empty') + let img = document.createElement('img') + img.src = browser.runtime.getURL('icons/betterseqta-light-icon.png') + let text = document.createElement('p') + text.innerText = 'No lessons available.' + dummyDay.append(img) + dummyDay.append(text) + DayContainer.append(dummyDay) } } } - }; + } xhr.send( JSON.stringify({ // Information sent to SEQTA page as a request with the dates and student number @@ -1625,7 +1625,7 @@ function callHomeTimetable(date: string, change?: any) { // Funny number student: 69, }), - ); + ) } function GetUpcomingAssessments() { @@ -1635,11 +1635,11 @@ function GetUpcomingAssessments() { 'Content-Type': 'application/json; charset=utf-8', }, body: JSON.stringify({ student: 69 }), - }); + }) return func .then((result) => result.json()) - .then((response) => response.payload); + .then((response) => response.payload) } async function GetActiveClasses() { @@ -1648,111 +1648,111 @@ async function GetActiveClasses() { method: 'POST', headers: { 'Content-Type': 'application/json; charset=utf-8' }, body: JSON.stringify({}) - }); + }) if (!response.ok) { - throw new Error(`HTTP error! Status: ${response.status}`); + throw new Error(`HTTP error! Status: ${response.status}`) } - const data = await response.json(); - return data.payload; + const data = await response.json() + return data.payload } catch (error) { - console.error('Oops! There was a problem fetching active classes:', error); + console.error('Oops! There was a problem fetching active classes:', error) } } function comparedate(obj1: any, obj2: any) { if (obj1.date < obj2.date) { - return -1; + return -1 } if (obj1.date > obj2.date) { - return 1; + return 1 } - return 0; + return 0 } function CreateElement(type: string, class_?: any, id?: any, innerText?: string, innerHTML?: string, style?: string) { - let element = document.createElement(type); + let element = document.createElement(type) if (class_ !== undefined) { - element.classList.add(class_); + element.classList.add(class_) } if (id !== undefined) { - element.id = id; + element.id = id } if (innerText !== undefined) { - element.innerText = innerText; + element.innerText = innerText } if (innerHTML !== undefined) { - element.innerHTML = innerHTML; + element.innerHTML = innerHTML } if (style !== undefined) { - element.style.cssText = style; + element.style.cssText = style } - return element; + return element } function createAssessmentDateDiv(date: string, value: any, datecase?: any) { - var options = { weekday: 'long' as 'long', month: 'long' as 'long', day: 'numeric' as 'numeric' }; - const FormattedDate = new Date(date); + var options = { weekday: 'long' as 'long', month: 'long' as 'long', day: 'numeric' as 'numeric' } + const FormattedDate = new Date(date) - const assessments = value.assessments; - const container = value.div; + const assessments = value.assessments + const container = value.div - let DateTitleDiv = document.createElement('div'); - DateTitleDiv.classList.add('upcoming-date-title'); + let DateTitleDiv = document.createElement('div') + DateTitleDiv.classList.add('upcoming-date-title') if (datecase) { - let datetitle = document.createElement('h5'); - datetitle.classList.add('upcoming-special-day'); - datetitle.innerText = datecase; - DateTitleDiv.append(datetitle); - container.setAttribute('data-day', datecase); + let datetitle = document.createElement('h5') + datetitle.classList.add('upcoming-special-day') + datetitle.innerText = datecase + DateTitleDiv.append(datetitle) + container.setAttribute('data-day', datecase) } - let DateTitle = document.createElement('h5'); - DateTitle.innerText = FormattedDate.toLocaleDateString('en-AU', options); - DateTitleDiv.append(DateTitle); + let DateTitle = document.createElement('h5') + DateTitle.innerText = FormattedDate.toLocaleDateString('en-AU', options) + DateTitleDiv.append(DateTitle) - container.append(DateTitleDiv); + container.append(DateTitleDiv) - let assessmentContainer = document.createElement('div'); - assessmentContainer.classList.add('upcoming-date-assessments'); + let assessmentContainer = document.createElement('div') + assessmentContainer.classList.add('upcoming-date-assessments') for (let i = 0; i < assessments.length; i++) { - const element = assessments[i]; - let item = document.createElement('div'); - item.classList.add('upcoming-assessment'); - item.setAttribute('data-subject', element.code); - item.id = `assessment${element.id}`; + const element = assessments[i] + let item = document.createElement('div') + item.classList.add('upcoming-assessment') + item.setAttribute('data-subject', element.code) + item.id = `assessment${element.id}` - item.style.cssText = element.colour; + item.style.cssText = element.colour - let titlediv = document.createElement('div'); - titlediv.classList.add('upcoming-subject-title'); + let titlediv = document.createElement('div') + titlediv.classList.add('upcoming-subject-title') let titlesvg = stringToHTML(` - `).firstChild; - titlediv.append(titlesvg!); - - let detailsdiv = document.createElement('div'); - detailsdiv.classList.add('upcoming-details'); - let detailstitle = document.createElement('h5'); - detailstitle.innerText = `${element.subject} assessment`; - let subject = document.createElement('p'); - subject.innerText = element.title; - subject.classList.add('upcoming-assessment-title'); + `).firstChild + titlediv.append(titlesvg!) + + let detailsdiv = document.createElement('div') + detailsdiv.classList.add('upcoming-details') + let detailstitle = document.createElement('h5') + detailstitle.innerText = `${element.subject} assessment` + let subject = document.createElement('p') + subject.innerText = element.title + subject.classList.add('upcoming-assessment-title') subject.onclick = function () { document.querySelector('#menu ul')!.classList.add('noscroll'); - location.href = `../#?page=/assessments/${element.programmeID}:${element.metaclassID}&item=${element.id}`; - }; - detailsdiv.append(detailstitle); - detailsdiv.append(subject); + location.href = `../#?page=/assessments/${element.programmeID}:${element.metaclassID}&item=${element.id}` + } + detailsdiv.append(detailstitle) + detailsdiv.append(subject) - item.append(titlediv); - item.append(detailsdiv); - assessmentContainer.append(item); + item.append(titlediv) + item.append(detailsdiv) + assessmentContainer.append(item) fetch(`${location.origin}/seqta/student/assessment/submissions/get`, { method: 'POST', @@ -1768,22 +1768,22 @@ function createAssessmentDateDiv(date: string, value: any, datecase?: any) { .then((result) => result.json()) .then((response) => { if (response.payload.length > 0) { - const assessment = document.querySelector(`#assessment${element.id}`); + const assessment = document.querySelector(`#assessment${element.id}`) // ticksvg = stringToHTML(``).firstChild - // ticksvg.classList.add('upcoming-tick'); - // assessment.append(ticksvg); - let submittedtext = document.createElement('div'); - submittedtext.classList.add('upcoming-submittedtext'); - submittedtext.innerText = 'Submitted'; - assessment!.append(submittedtext); + // ticksvg.classList.add('upcoming-tick') + // assessment.append(ticksvg) + let submittedtext = document.createElement('div') + submittedtext.classList.add('upcoming-submittedtext') + submittedtext.innerText = 'Submitted' + assessment!.append(submittedtext) } - }); + }) } - container.append(assessmentContainer); + container.append(assessmentContainer) - return container; + return container } function CheckSpecialDay(date1: Date, date2: Date) { @@ -1792,227 +1792,227 @@ function CheckSpecialDay(date1: Date, date2: Date) { date1.getMonth() === date2.getMonth() && date1.getDate() - 1 === date2.getDate() ) { - return 'Yesterday'; + return 'Yesterday' } if ( date1.getFullYear() === date2.getFullYear() && date1.getMonth() === date2.getMonth() && date1.getDate() === date2.getDate() ) { - return 'Today'; + return 'Today' } if ( date1.getFullYear() === date2.getFullYear() && date1.getMonth() === date2.getMonth() && date1.getDate() + 1 === date2.getDate() ) { - return 'Tomorrow'; + return 'Tomorrow' } } function CreateSubjectFilter(subjectcode: any, itemcolour: string, checked: any) { - let label = CreateElement('label', 'upcoming-checkbox-container'); - label.innerText = subjectcode; - let input1 = CreateElement('input'); + let label = CreateElement('label', 'upcoming-checkbox-container') + label.innerText = subjectcode + let input1 = CreateElement('input') const input = input1 as HTMLInputElement - input.type = 'checkbox'; - input.checked = checked; - input.id = `filter-${subjectcode}`; - label.style.cssText = itemcolour; - let span = CreateElement('span', 'upcoming-checkmark'); - label.append(input); - label.append(span); + input.type = 'checkbox' + input.checked = checked + input.id = `filter-${subjectcode}` + label.style.cssText = itemcolour + let span = CreateElement('span', 'upcoming-checkmark') + label.append(input) + label.append(span) input.addEventListener('change', function (change) { const result = browser.storage.local.get() function open (storage: any) { - let filters = storage.subjectfilters; - let id = (change.target as HTMLInputElement)!.id.split('-')[1]; - filters[id] = (change.target as HTMLInputElement)!.checked; + let filters = storage.subjectfilters + let id = (change.target as HTMLInputElement)!.id.split('-')[1] + filters[id] = (change.target as HTMLInputElement)!.checked - browser.storage.local.set({ subjectfilters: filters }); + browser.storage.local.set({ subjectfilters: filters }) } result.then(open, onError) - }); + }) - return label; + return label } function CreateFilters(subjects: any) { const result = browser.storage.local.get() function open (result: any) { - let filteroptions = result.subjectfilters; + let filteroptions = result.subjectfilters - let filterdiv = document.querySelector('#upcoming-filters'); + let filterdiv = document.querySelector('#upcoming-filters') for (let i = 0; i < subjects.length; i++) { - const element = subjects[i]; + const element = subjects[i] // eslint-disable-next-line if (!Object.prototype.hasOwnProperty.call(filteroptions, element.code)) { - filteroptions[element.code] = true; - browser.storage.local.set({ subjectfilters: filteroptions }); + filteroptions[element.code] = true + browser.storage.local.set({ subjectfilters: filteroptions }) } let elementdiv = CreateSubjectFilter( element.code, element.colour, filteroptions[element.code], - ); + ) - filterdiv!.append(elementdiv); + filterdiv!.append(elementdiv) } } result.then(open, onError) } function CreateUpcomingSection(assessments: any, activeSubjects: any) { - let upcomingitemcontainer = document.querySelector('#upcoming-items'); - let overdueDates = []; - let upcomingDates = {}; + let upcomingitemcontainer = document.querySelector('#upcoming-items') + let overdueDates = [] + let upcomingDates = {} - // date = '2022/3/20'; - // var Today = new Date(date); + // date = '2022/3/20' + // var Today = new Date(date) - var Today = new Date(); + var Today = new Date() // Removes overdue assessments from the upcoming assessments array and pushes to overdue array for (let i = 0; i < assessments.length; i++) { - const element = assessments[i]; - let assessmentdue = new Date(element.due); + const element = assessments[i] + let assessmentdue = new Date(element.due) - CheckSpecialDay(Today, assessmentdue); + CheckSpecialDay(Today, assessmentdue) if (assessmentdue < Today) { if (!CheckSpecialDay(Today, assessmentdue)) { - overdueDates.push(element); - assessments.splice(i, 1); - i--; + overdueDates.push(element) + assessments.splice(i, 1) + i-- } } } - var TomorrowDate = new Date(); - TomorrowDate.setDate(TomorrowDate.getDate() + 1); + var TomorrowDate = new Date() + TomorrowDate.setDate(TomorrowDate.getDate() + 1) GetLessonColours().then((colours) => { - let subjects = colours; + let subjects = colours for (let i = 0; i < assessments.length; i++) { - let subjectname = `timetable.subject.colour.${assessments[i].code}`; + let subjectname = `timetable.subject.colour.${assessments[i].code}` - let subject = subjects.find((element: any) => element.name === subjectname); + let subject = subjects.find((element: any) => element.name === subjectname) if (!subject) { - assessments[i].colour = '--item-colour: #8e8e8e;'; + assessments[i].colour = '--item-colour: #8e8e8e;' } else { - assessments[i].colour = `--item-colour: ${subject.value};`; + assessments[i].colour = `--item-colour: ${subject.value};` GetThresholdOfColor(subject.value); // result (originally) result = GetThresholdOfColor } } for (let i = 0; i < activeSubjects.length; i++) { - const element = activeSubjects[i]; - let subjectname = `timetable.subject.colour.${element.code}`; - let colour = colours.find((element: any) => element.name === subjectname); + const element = activeSubjects[i] + let subjectname = `timetable.subject.colour.${element.code}` + let colour = colours.find((element: any) => element.name === subjectname) if (!colour) { - element.colour = '--item-colour: #8e8e8e;'; + element.colour = '--item-colour: #8e8e8e;' } else { - element.colour = `--item-colour: ${colour.value};`; - let result = GetThresholdOfColor(colour.value); + element.colour = `--item-colour: ${colour.value};` + let result = GetThresholdOfColor(colour.value) if (result > 300) { - element.invert = true; + element.invert = true } } } - CreateFilters(activeSubjects); + CreateFilters(activeSubjects) // @ts-ignore - let type; + let type // @ts-ignore - let class_; + let class_ for (let i = 0; i < assessments.length; i++) { - const element: any = assessments[i]; + const element: any = assessments[i] if (!upcomingDates[element.due as keyof typeof upcomingDates]) { - let dateObj: any = new Object(); + let dateObj: any = new Object() dateObj.div = CreateElement( // TODO: not sure whats going on here? // eslint-disable-next-line type = "div", // eslint-disable-next-line class_ = "upcoming-date-container", - ); - dateObj.assessments = []; + ) + dateObj.assessments = [] - dateObj = upcomingDates[element.due as keyof typeof upcomingDates] as any; + dateObj = upcomingDates[element.due as keyof typeof upcomingDates] as any } let assessmentDateDiv = upcomingDates[element.due as keyof typeof upcomingDates]; - (assessmentDateDiv as any).assessments.push(element); + (assessmentDateDiv as any).assessments.push(element) } for (var date in upcomingDates) { - let assessmentdue = new Date((upcomingDates[date as keyof typeof upcomingDates] as any).assessments[0].due); - let specialcase = CheckSpecialDay(Today, assessmentdue); - let assessmentDate; + let assessmentdue = new Date((upcomingDates[date as keyof typeof upcomingDates] as any).assessments[0].due) + let specialcase = CheckSpecialDay(Today, assessmentdue) + let assessmentDate if (specialcase) { - let datecase: string = specialcase!; + let datecase: string = specialcase! assessmentDate = createAssessmentDateDiv( date, upcomingDates[date as keyof typeof upcomingDates], // eslint-disable-next-line datecase, - ); + ) } else { - assessmentDate = createAssessmentDateDiv(date, upcomingDates[date as keyof typeof upcomingDates]); + assessmentDate = createAssessmentDateDiv(date, upcomingDates[date as keyof typeof upcomingDates]) } if (specialcase === 'Yesterday') { upcomingitemcontainer!.insertBefore( assessmentDate, upcomingitemcontainer!.firstChild, - ); + ) } else { - upcomingitemcontainer!.append(assessmentDate); + upcomingitemcontainer!.append(assessmentDate) } } const result = browser.storage.local.get() function open (result: any) { - FilterUpcomingAssessments(result.subjectfilters); + FilterUpcomingAssessments(result.subjectfilters) } result.then(open, onError) - }); + }) } function AddPlaceHolderToParent(parent: any, numberofassessments: any) { - let textcontainer = CreateElement('div', 'upcoming-blank'); - let textblank = CreateElement('p', 'upcoming-hiddenassessment'); - let s = ''; + let textcontainer = CreateElement('div', 'upcoming-blank') + let textblank = CreateElement('p', 'upcoming-hiddenassessment') + let s = '' if (numberofassessments > 1) { - s = 's'; + s = 's' } - textblank.innerText = `${numberofassessments} hidden assessment${s} due`; - textcontainer.append(textblank); - textcontainer.setAttribute('data-hidden', 'true'); + textblank.innerText = `${numberofassessments} hidden assessment${s} due` + textcontainer.append(textblank) + textcontainer.setAttribute('data-hidden', 'true') - parent.append(textcontainer); + parent.append(textcontainer) } function FilterUpcomingAssessments(subjectoptions: any) { for (var item in subjectoptions) { - let subjectdivs = document.querySelectorAll(`[data-subject="${item}"]`); + let subjectdivs = document.querySelectorAll(`[data-subject="${item}"]`) for (let i = 0; i < subjectdivs.length; i++) { - const element = subjectdivs[i]; + const element = subjectdivs[i] if (!subjectoptions[item]) { - element.classList.add('hidden'); + element.classList.add('hidden') } if (subjectoptions[item]) { - element.classList.remove('hidden'); + element.classList.remove('hidden') } - (element.parentNode! as HTMLElement).classList.remove('hidden'); + (element.parentNode! as HTMLElement).classList.remove('hidden') - let children = element.parentNode!.parentNode!.children; + let children = element.parentNode!.parentNode!.children for (let i = 0; i < children.length; i++) { - const element = children[i]; + const element = children[i] if (element.hasAttribute('data-hidden')) { - element.remove(); + element.remove() } } @@ -2022,16 +2022,16 @@ function FilterUpcomingAssessments(subjectoptions: any) { ) { if (element.parentNode!.querySelectorAll('.hidden').length > 0) { if (!(element.parentNode!.parentNode! as HTMLElement).hasAttribute('data-day')) { - (element.parentNode!.parentNode! as HTMLElement).classList.add('hidden'); + (element.parentNode!.parentNode! as HTMLElement).classList.add('hidden') } else { AddPlaceHolderToParent( element.parentNode!.parentNode, element.parentNode!.querySelectorAll('.hidden').length, - ); + ) } } } else { - (element.parentNode!.parentNode! as HTMLElement).classList.remove('hidden'); + (element.parentNode!.parentNode! as HTMLElement).classList.remove('hidden') } } } @@ -2039,9 +2039,9 @@ function FilterUpcomingAssessments(subjectoptions: any) { browser.storage.onChanged.addListener(function (changes) { if (changes.subjectfilters) { - FilterUpcomingAssessments(changes.subjectfilters.newValue); + FilterUpcomingAssessments(changes.subjectfilters.newValue) } -}); +}) async function GetLessonColours() { let func = fetch(`${location.origin}/seqta/student/load/prefs?`, { @@ -2050,20 +2050,20 @@ async function GetLessonColours() { 'Content-Type': 'application/json; charset=utf-8', }, body: JSON.stringify({ request: 'userPrefs', asArray: true, user: 69 }), - }); + }) return func .then((result) => result.json()) - .then((response) => response.payload); + .then((response) => response.payload) } export function CreateCustomShortcutDiv(element: any) { // Creates the stucture and element information for each seperate shortcut - var shortcut = document.createElement('a'); - shortcut.setAttribute('href', element.url); - shortcut.setAttribute('target', '_blank'); - var shortcutdiv = document.createElement('div'); - shortcutdiv.classList.add('shortcut'); - shortcutdiv.classList.add('customshortcut'); + var shortcut = document.createElement('a') + shortcut.setAttribute('href', element.url) + shortcut.setAttribute('target', '_blank') + var shortcutdiv = document.createElement('div') + shortcutdiv.classList.add('shortcut') + shortcutdiv.classList.add('customshortcut') let image = stringToHTML( ` @@ -2082,49 +2082,49 @@ export function CreateCustomShortcutDiv(element: any) { `, ).firstChild; - (image as HTMLElement).classList.add('shortcuticondiv'); - var text = document.createElement('p'); - text.textContent = element.name; - shortcutdiv.append(image!); - shortcutdiv.append(text); - shortcut.append(shortcutdiv); - - document.getElementById('shortcuts')!.append(shortcut); + (image as HTMLElement).classList.add('shortcuticondiv') + var text = document.createElement('p') + text.textContent = element.name + shortcutdiv.append(image!) + shortcutdiv.append(text) + shortcut.append(shortcutdiv) + + document.getElementById('shortcuts')!.append(shortcut) } export function RemoveShortcutDiv(elements: any) { elements.forEach((element: any) => { - const shortcuts = document.querySelectorAll('.shortcut'); + const shortcuts = document.querySelectorAll('.shortcut') shortcuts.forEach((shortcut) => { const anchorElement = shortcut.parentElement; // the element is the parent const textElement = shortcut.querySelector('p'); //

    is a direct child of .shortcut - const title = textElement ? textElement.textContent : ''; + const title = textElement ? textElement.textContent : '' - let shouldRemove = title === element.name; + let shouldRemove = title === element.name // Check href only if element.url exists if (element.url) { - shouldRemove = shouldRemove && (anchorElement!.getAttribute('href') === element.url); + shouldRemove = shouldRemove && (anchorElement!.getAttribute('href') === element.url) } if (shouldRemove) { - anchorElement!.remove(); + anchorElement!.remove() } - }); - }); + }) + }) } function AddCustomShortcutsToPage() { const result = browser.storage.local.get(['customshortcuts']) function open (result: any) { - var customshortcuts: any = Object.values(result)[0]; + var customshortcuts: any = Object.values(result)[0] if (customshortcuts.length > 0) { (document.getElementsByClassName('shortcut-container')[0] as HTMLElement).style.display = - 'block'; + 'block' for (let i = 0; i < customshortcuts.length; i++) { - const element = customshortcuts[i]; - CreateCustomShortcutDiv(element); + const element = customshortcuts[i] + CreateCustomShortcutDiv(element) } } } @@ -2133,146 +2133,146 @@ function AddCustomShortcutsToPage() { async function SendHomePage() { // Sends the html data for the home page - console.log('[BetterSEQTA] Started Loading Home Page'); - document.title = 'Home ― SEQTA Learn'; - var element = document.querySelector('[data-key=home]'); + console.log('[BetterSEQTA] Started Loading Home Page') + document.title = 'Home ― SEQTA Learn' + var element = document.querySelector('[data-key=home]') // Apply the active class to indicate clicked on home button - element!.classList.add('active'); + element!.classList.add('active') // Remove all current elements in the main div to add new elements - var main = document.getElementById('main'); - main!.innerHTML = ''; + var main = document.getElementById('main') + main!.innerHTML = '' const titlediv = document.getElementById('title')!.firstChild; ((titlediv!) as HTMLElement).innerHTML = 'Home'; (document.querySelector('link[rel*="icon"]')! as HTMLLinkElement).href = - browser.runtime.getURL('icons/icon-48.png'); + browser.runtime.getURL('icons/icon-48.png') - currentSelectedDate = new Date(); + currentSelectedDate = new Date() // Creates the root of the home page added to the main div - var html = stringToHTML('

    '); + var html = stringToHTML('
    ') // Appends the html file to main div // Note : firstChild of html is done due to needing to grab the body from the stringToHTML function - main!.append(html.firstChild!); + main!.append(html.firstChild!) // Gets the current date - const date = new Date(); + const date = new Date() // Formats the current date used send a request for timetable and notices later var TodayFormatted = - date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + (date.getDate() < 10 ? '0' : '') + date.getDate(); + date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + (date.getDate() < 10 ? '0' : '') + date.getDate() // Replaces actual date with a selected date. Used for testing. - // TodayFormatted = "2020-08-31"; + // TodayFormatted = "2020-08-31" // Creates the shortcut container into the home container - var ShortcutStr = '
    '; - var Shortcut = stringToHTML(ShortcutStr); + var ShortcutStr = '
    ' + var Shortcut = stringToHTML(ShortcutStr) // Appends the shortcut container into the home container - document.getElementById('home-container')!.append(Shortcut.firstChild!); + document.getElementById('home-container')!.append(Shortcut.firstChild!) // Creates the container div for the timetable portion of the home page - var TimetableStr = '

    Today\'s Lessons

    '; - var Timetable = stringToHTML(TimetableStr); + var TimetableStr = '

    Today\'s Lessons

    ' + var Timetable = stringToHTML(TimetableStr) // Appends the timetable container into the home container - document.getElementById('home-container')!.append(Timetable.firstChild!); + document.getElementById('home-container')!.append(Timetable.firstChild!) callHomeTimetable(TodayFormatted, true) - var timetablearrowback = document.getElementById('home-timetable-back'); + var timetablearrowback = document.getElementById('home-timetable-back') var timetablearrowforward = document.getElementById( 'home-timetable-forward', - ); + ) function SetTimetableSubtitle() { - var homelessonsubtitle = document.getElementById('home-lesson-subtitle'); - const date = new Date(); + var homelessonsubtitle = document.getElementById('home-lesson-subtitle') + const date = new Date() if ( date.getFullYear() == currentSelectedDate.getFullYear() && date.getMonth() == currentSelectedDate.getMonth() ) { if (date.getDate() == currentSelectedDate.getDate()) { // Change text to Today's Lessons - homelessonsubtitle!.innerText = 'Today\'s Lessons'; + homelessonsubtitle!.innerText = 'Today\'s Lessons' } else if (date.getDate() - 1 == currentSelectedDate.getDate()) { // Change text to Yesterday's Lessons - homelessonsubtitle!.innerText = 'Yesterday\'s Lessons'; + homelessonsubtitle!.innerText = 'Yesterday\'s Lessons' } else if (date.getDate() + 1 == currentSelectedDate.getDate()) { // Change text to Tomorrow's Lessons - homelessonsubtitle!.innerText = 'Tomorrow\'s Lessons'; + homelessonsubtitle!.innerText = 'Tomorrow\'s Lessons' } else { // Change text to date of the day homelessonsubtitle!.innerText = `${currentSelectedDate.toLocaleString( 'en-us', { weekday: 'short' }, - )} ${currentSelectedDate.toLocaleDateString('en-au')}`; + )} ${currentSelectedDate.toLocaleDateString('en-au')}` } } else { // Change text to date of the day homelessonsubtitle!.innerText = `${currentSelectedDate.toLocaleString( 'en-us', { weekday: 'short' }, - )} ${currentSelectedDate.toLocaleDateString('en-au')}`; + )} ${currentSelectedDate.toLocaleDateString('en-au')}` } } function changeTimetable(value: any) { - currentSelectedDate.setDate(currentSelectedDate.getDate() + value); + currentSelectedDate.setDate(currentSelectedDate.getDate() + value) let FormattedDate = currentSelectedDate.getFullYear() + '-' + (currentSelectedDate.getMonth() + 1) + '-' + - currentSelectedDate.getDate(); - callHomeTimetable(FormattedDate, true); - SetTimetableSubtitle(); + currentSelectedDate.getDate() + callHomeTimetable(FormattedDate, true) + SetTimetableSubtitle() } timetablearrowback!.addEventListener('click', function () { - changeTimetable(-1); - }); + changeTimetable(-1) + }) timetablearrowforward!.addEventListener('click', function () { - changeTimetable(1); - }); + changeTimetable(1) + }) // Adds the shortcuts to the shortcut container const result = browser.storage.local.get(['shortcuts']) function open (result: any) { - const shortcuts = Object.values(result)[0]; - addShortcuts(shortcuts); + const shortcuts = Object.values(result)[0] + addShortcuts(shortcuts) } result.then(open, onError) // Creates the upcoming container and appends to the home container - var upcomingcontainer = document.createElement('div'); - upcomingcontainer.classList.add('upcoming-container'); - upcomingcontainer.classList.add('border'); + var upcomingcontainer = document.createElement('div') + upcomingcontainer.classList.add('upcoming-container') + upcomingcontainer.classList.add('border') - let upcomingtitlediv = CreateElement('div', 'upcoming-title'); - let upcomingtitle = document.createElement('h2'); - upcomingtitle.classList.add('home-subtitle'); - upcomingtitle.innerText = 'Upcoming Assessments'; - upcomingtitlediv.append(upcomingtitle); + let upcomingtitlediv = CreateElement('div', 'upcoming-title') + let upcomingtitle = document.createElement('h2') + upcomingtitle.classList.add('home-subtitle') + upcomingtitle.innerText = 'Upcoming Assessments' + upcomingtitlediv.append(upcomingtitle) let upcomingfilterdiv = CreateElement( 'div', 'upcoming-filters', 'upcoming-filters', - ); - upcomingtitlediv.append(upcomingfilterdiv); + ) + upcomingtitlediv.append(upcomingfilterdiv) - upcomingcontainer.append(upcomingtitlediv); + upcomingcontainer.append(upcomingtitlediv) - let upcomingitems = document.createElement('div'); - upcomingitems.id = 'upcoming-items'; - upcomingitems.classList.add('upcoming-items'); + let upcomingitems = document.createElement('div') + upcomingitems.id = 'upcoming-items' + upcomingitems.classList.add('upcoming-items') - upcomingcontainer.append(upcomingitems); + upcomingcontainer.append(upcomingitems) - document.getElementById('home-container')!.append(upcomingcontainer); + document.getElementById('home-container')!.append(upcomingcontainer) // Creates the notices container into the home container const NoticesStr = String.raw` @@ -2284,9 +2284,9 @@ async function SendHomePage() {
    ` - var Notices = stringToHTML(NoticesStr); + var Notices = stringToHTML(NoticesStr) // Appends the shortcut container into the home container - document.getElementById('home-container')!.append(Notices.firstChild!); + document.getElementById('home-container')!.append(Notices.firstChild!) animate( '.home-container > div', @@ -2296,9 +2296,9 @@ async function SendHomePage() { duration: 0.6, easing: [.22, .03, .26, 1] } - ); + ) - callHomeTimetable(TodayFormatted); + callHomeTimetable(TodayFormatted) const GetPrefs = await fetch(`${location.origin}/seqta/student/load/prefs?`, { method: 'POST', @@ -2472,208 +2472,208 @@ async function SendHomePage() { const result1 = browser.storage.local.get() function open1 (result: any) { if (result.notificationcollector) { - enableNotificationCollector(); + enableNotificationCollector() } } result1.then(open1, onError) - let activeClassList: any; + let activeClassList: any const assessments = await GetUpcomingAssessments() const classes = await GetActiveClasses() // Gets all subjects for the student for (let i = 0; i < classes.length; i++) { - const element = classes[i]; + const element = classes[i] // eslint-disable-next-line if (element.hasOwnProperty("active")) { // for some reason eslint gets mad, even though it works? // Finds the active class list with the current subjects - activeClassList = classes[i]; + activeClassList = classes[i] } } - let activeSubjects = activeClassList.subjects; + let activeSubjects = activeClassList.subjects - let activeSubjectCodes = []; + let activeSubjectCodes = [] // Gets the code for each of the subjects and puts them in an array for (let i = 0; i < activeSubjects.length; i++) { - activeSubjectCodes.push(activeSubjects[i].code); + activeSubjectCodes.push(activeSubjects[i].code) } - let CurrentAssessments = []; + let CurrentAssessments = [] for (let i = 0; i < assessments.length; i++) { if (activeSubjectCodes.includes(assessments[i].code)) { - CurrentAssessments.push(element); + CurrentAssessments.push(element) } } - CurrentAssessments.sort(comparedate); + CurrentAssessments.sort(comparedate) - CreateUpcomingSection(CurrentAssessments, activeSubjects); + CreateUpcomingSection(CurrentAssessments, activeSubjects) } export function addShortcuts(shortcuts: any) { for (let i = 0; i < shortcuts.length; i++) { - const currentShortcut = shortcuts[i]; + const currentShortcut = shortcuts[i] if (currentShortcut?.enabled) { - const Itemname = (currentShortcut?.name ?? '').replace(/\s/g, ''); + const Itemname = (currentShortcut?.name ?? '').replace(/\s/g, '') - const linkDetails = ShortcutLinks?.[Itemname as keyof typeof ShortcutLinks]; + const linkDetails = ShortcutLinks?.[Itemname as keyof typeof ShortcutLinks] if (linkDetails) { createNewShortcut( linkDetails.link, linkDetails.icon, linkDetails.viewBox, currentShortcut?.name - ); + ) } else { - console.warn(`No link details found for '${Itemname}'`); + console.warn(`No link details found for '${Itemname}'`) } } } - AddCustomShortcutsToPage(); + AddCustomShortcutsToPage() } export function enableNotificationCollector() { - var xhr3 = new XMLHttpRequest(); - xhr3.open('POST', `${location.origin}/seqta/student/heartbeat?`, true); + var xhr3 = new XMLHttpRequest() + xhr3.open('POST', `${location.origin}/seqta/student/heartbeat?`, true) xhr3.setRequestHeader( 'Content-Type', 'application/json; charset=utf-8' - ); + ) xhr3.onreadystatechange = function () { if (xhr3.readyState === 4) { - var Notifications = JSON.parse(xhr3.response); + var Notifications = JSON.parse(xhr3.response) var alertdiv = document.getElementsByClassName( 'notifications__bubble___1EkSQ' - )[0]; + )[0] if (typeof alertdiv == 'undefined') { - console.log('[BetterSEQTA] No notifications currently'); + console.log('[BetterSEQTA] No notifications currently') } else { - alertdiv.textContent = Notifications.payload.notifications.length; + alertdiv.textContent = Notifications.payload.notifications.length } } - }; + } xhr3.send( JSON.stringify({ timestamp: '1970-01-01 00:00:00.0', hash: '#?page=/home', }) - ); + ) } export function disableNotificationCollector() { - var alertdiv = document.getElementsByClassName('notifications__bubble___1EkSQ')[0]; + var alertdiv = document.getElementsByClassName('notifications__bubble___1EkSQ')[0] if (typeof alertdiv != 'undefined') { - var currentNumber = parseInt(alertdiv.textContent!); + var currentNumber = parseInt(alertdiv.textContent!) if (currentNumber < 9) { - alertdiv.textContent = currentNumber.toString(); + alertdiv.textContent = currentNumber.toString() } else { - alertdiv.textContent = '9+'; + alertdiv.textContent = '9+' } } } function createNewShortcut(link: any, icon: any, viewBox: any, title: any) { // Creates the stucture and element information for each seperate shortcut - let shortcut = document.createElement('a'); - shortcut.setAttribute('href', link); - shortcut.setAttribute('target', '_blank'); - let shortcutdiv = document.createElement('div'); - shortcutdiv.classList.add('shortcut'); + let shortcut = document.createElement('a') + shortcut.setAttribute('href', link) + shortcut.setAttribute('target', '_blank') + let shortcutdiv = document.createElement('div') + shortcutdiv.classList.add('shortcut') let image = stringToHTML( ``, ).firstChild; - (image! as HTMLElement).classList.add('shortcuticondiv'); - let text = document.createElement('p'); - text.textContent = title; - shortcutdiv.append(image as HTMLElement); - shortcutdiv.append(text); - shortcut.append(shortcutdiv); - - document.getElementById('shortcuts')!.appendChild(shortcut); + (image! as HTMLElement).classList.add('shortcuticondiv') + let text = document.createElement('p') + text.textContent = title + shortcutdiv.append(image as HTMLElement) + shortcutdiv.append(text) + shortcut.append(shortcutdiv) + + document.getElementById('shortcuts')!.appendChild(shortcut) } function SendNewsPage() { setTimeout(function () { // Sends the html data for the home page - console.log('[BetterSEQTA] Started Loading News Page'); - document.title = 'News ― SEQTA Learn'; - var element = document.querySelector('[data-key=news]'); + console.log('[BetterSEQTA] Started Loading News Page') + document.title = 'News ― SEQTA Learn' + var element = document.querySelector('[data-key=news]') // Apply the active class to indicate clicked on home button - element!.classList.add('active'); + element!.classList.add('active') // Remove all current elements in the main div to add new elements - var main = document.getElementById('main'); - main!.innerHTML = ''; + var main = document.getElementById('main') + main!.innerHTML = '' // Creates the root of the home page added to the main div - var htmlStr = '

    Latest Headlines - ABC News

    '; + var htmlStr = '

    Latest Headlines - ABC News

    ' - var html = stringToHTML(htmlStr); + var html = stringToHTML(htmlStr) // Appends the html file to main div // Note : firstChild of html is done due to needing to grab the body from the stringToHTML function - main!.append(html.firstChild!); + main!.append(html.firstChild!) const titlediv = document.getElementById('title')!.firstChild; - (titlediv! as HTMLElement).innerText = 'News'; - AppendLoadingSymbol('newsloading', '#news-container'); + (titlediv! as HTMLElement).innerText = 'News' + AppendLoadingSymbol('newsloading', '#news-container') browser.runtime.sendMessage({ type: 'sendNews' }).then(function (response) { - let newsarticles = response.news.articles; - var newscontainer = document.querySelector('#news-container'); - document.getElementById('newsloading')!.remove(); + let newsarticles = response.news.articles + var newscontainer = document.querySelector('#news-container') + document.getElementById('newsloading')!.remove() for (let i = 0; i < newsarticles.length; i++) { - let newsarticle = document.createElement('a'); - newsarticle.classList.add('NewsArticle'); - newsarticle.href = newsarticles[i].url; - newsarticle.target = '_blank'; + let newsarticle = document.createElement('a') + newsarticle.classList.add('NewsArticle') + newsarticle.href = newsarticles[i].url + newsarticle.target = '_blank' - let articleimage = document.createElement('div'); - articleimage.classList.add('articleimage'); + let articleimage = document.createElement('div') + articleimage.classList.add('articleimage') if (newsarticles[i].urlToImage == 'null') { articleimage.style.backgroundImage = `url(${browser.runtime.getURL( 'icons/betterseqta-light-outline.png', - )})`; - articleimage.style.width = '20%'; - articleimage.style.margin = '0 7.5%'; + )})` + articleimage.style.width = '20%' + articleimage.style.margin = '0 7.5%' } else { - articleimage.style.backgroundImage = `url(${newsarticles[i].urlToImage})`; + articleimage.style.backgroundImage = `url(${newsarticles[i].urlToImage})` } - let articletext = document.createElement('div'); - articletext.classList.add('ArticleText'); - let title = document.createElement('a'); - title.innerText = newsarticles[i].title; - title.href = newsarticles[i].url; - title.target = '_blank'; + let articletext = document.createElement('div') + articletext.classList.add('ArticleText') + let title = document.createElement('a') + title.innerText = newsarticles[i].title + title.href = newsarticles[i].url + title.target = '_blank' - let description = document.createElement('p'); - description.innerHTML = newsarticles[i].description; + let description = document.createElement('p') + description.innerHTML = newsarticles[i].description - articletext.append(title); - articletext.append(description); + articletext.append(title) + articletext.append(description) - newsarticle.append(articleimage); - newsarticle.append(articletext); - newscontainer!.append(newsarticle); + newsarticle.append(articleimage) + newsarticle.append(articletext) + newscontainer!.append(newsarticle) } - }); - }, 8); + }) + }, 8) } async function CheckForMenuList() { if (!MenuItemMutation) { try { if (document.getElementById('menu')!.firstChild) { - ObserveMenuItemPosition(); - MenuItemMutation = true; + ObserveMenuItemPosition() + MenuItemMutation = true } } catch (error) { - return; + return } } } @@ -2715,11 +2715,11 @@ function documentTextColor () { browser.storage.onChanged.addListener(documentTextColor) function LoadInit() { - console.log('[BetterSEQTA] Started Init'); + console.log('[BetterSEQTA] Started Init') const result = browser.storage.local.get() function open (result: any) { if (result.onoff) { - SendHomePage(); + SendHomePage() } } result.then(open, onError) From ff0c6bc3d8a5be3bb62db691b6c798583c09c235 Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Wed, 20 Dec 2023 15:15:02 +1100 Subject: [PATCH 20/46] fix react data-ison error --- src/interface/components/Switch.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/interface/components/Switch.tsx b/src/interface/components/Switch.tsx index c0368cdb..ff3e7b19 100644 --- a/src/interface/components/Switch.tsx +++ b/src/interface/components/Switch.tsx @@ -11,7 +11,7 @@ export default function Switch(props: SwitchProps) { return (
    Date: Thu, 21 Dec 2023 13:23:31 +1100 Subject: [PATCH 21/46] fix icons not loading properly --- src/SEQTA.ts | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/SEQTA.ts b/src/SEQTA.ts index ee8c5b67..e87d468b 100644 --- a/src/SEQTA.ts +++ b/src/SEQTA.ts @@ -674,11 +674,13 @@ function main(storedSetting: SettingsState) { waitForElm('.code').then(AppendElementsToDisabledPage) } - if (storedSetting.DarkMode) { + console.log("Enabled > ", storedSetting.onoff) + if (storedSetting.onoff) { console.log('[BetterSEQTA+] Enabled') - if (DarkMode) { - document.documentElement.classList.add('dark') - } + if (DarkMode) document.documentElement.classList.add('dark') + + new StorageListener() + new MessageHandler() updateAllColors(storedSetting) loading() @@ -695,16 +697,17 @@ function main(storedSetting: SettingsState) { } function InjectCustomIcons() { + console.log('[BetterSEQTA+] Injecting Icons') const fontURL = browser.runtime.getURL('fonts/IconFamily.woff') const style = document.createElement('style') style.setAttribute('type', 'text/css') style.innerHTML = ` @font-face { - font-family: 'IconFamily' - src: url('${fontURL}') format('woff') - font-weight: normal - font-style: normal + font-family: 'IconFamily'; + src: url('${fontURL}') format('woff'); + font-weight: normal; + font-style: normal; }` document.head.appendChild(style) } @@ -741,9 +744,6 @@ export function AppendElementsToDisabledPage() { document.head.append(settingsStyle) } -new StorageListener() -new MessageHandler() - var PageLoaded = false async function CheckLoadOnPeriods() { if (!PageLoaded) { From 8b5eb9cfb2f9c11378a01111bcd2550c209ba05e Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Thu, 21 Dec 2023 13:23:40 +1100 Subject: [PATCH 22/46] removed unused code --- src/SEQTA.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/SEQTA.ts b/src/SEQTA.ts index e87d468b..11dfb199 100644 --- a/src/SEQTA.ts +++ b/src/SEQTA.ts @@ -674,7 +674,6 @@ function main(storedSetting: SettingsState) { waitForElm('.code').then(AppendElementsToDisabledPage) } - console.log("Enabled > ", storedSetting.onoff) if (storedSetting.onoff) { console.log('[BetterSEQTA+] Enabled') if (DarkMode) document.documentElement.classList.add('dark') From d9f82b24e46d87251558878fcfc0244d8758a3ad Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Thu, 21 Dec 2023 13:24:33 +1100 Subject: [PATCH 23/46] remove unnecessary console logs --- src/interface/hooks/ThemeManagment.tsx | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/interface/hooks/ThemeManagment.tsx b/src/interface/hooks/ThemeManagment.tsx index 51c8bf5f..c3d43c02 100644 --- a/src/interface/hooks/ThemeManagment.tsx +++ b/src/interface/hooks/ThemeManagment.tsx @@ -6,7 +6,7 @@ interface ThemeList { export const downloadTheme = async (themeName: string, themeURL: string) => { // send message to the background script - const response = await browser.runtime.sendMessage({ + await browser.runtime.sendMessage({ type: 'currentTab', info: 'DownloadTheme', body: { @@ -14,13 +14,11 @@ export const downloadTheme = async (themeName: string, themeURL: string) => { themeURL: themeURL } }); - - console.log("Response: ", response); } export const setTheme = async (themeName: string, themeURL: string) => { // send message to the background script - const response = await browser.runtime.sendMessage({ + await browser.runtime.sendMessage({ type: 'currentTab', info: 'SetTheme', body: { @@ -28,8 +26,6 @@ export const setTheme = async (themeName: string, themeURL: string) => { themeURL: themeURL } }); - - console.log("Response: ", response); } export const listThemes = async () => { @@ -39,9 +35,6 @@ export const listThemes = async () => { info: 'ListThemes' }); - // response.themes is an array of strings that are identical to the theme names that we loop over. Use this list to see which ones are downloaded and which ones need to see the download icon. - console.log("Response: ", response); - return response; } From 5259ebe41f483d2d29a44cab92b0c6cb794e20ce Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Thu, 21 Dec 2023 13:27:13 +1100 Subject: [PATCH 24/46] clean up background.{html,js} --- public/backgrounds/background.html | 5 +---- public/backgrounds/background.js | 1 - 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/public/backgrounds/background.html b/public/backgrounds/background.html index e6561a62..cbf1a004 100644 --- a/public/backgrounds/background.html +++ b/public/backgrounds/background.html @@ -19,13 +19,10 @@ object-fit: cover; } - -
    - -
    +
    diff --git a/public/backgrounds/background.js b/public/backgrounds/background.js index 68490476..c5cdcf7b 100644 --- a/public/backgrounds/background.js +++ b/public/backgrounds/background.js @@ -17,7 +17,6 @@ const openDB = () => { const readData = async () => { const selectedBackground = localStorage.getItem('selectedBackground'); if (!selectedBackground) { - console.log('No selected background in local storage.'); return null; } From a0f7c4f40ff700194660e4eb9de6df263f2cf172 Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Thu, 21 Dec 2023 13:29:46 +1100 Subject: [PATCH 25/46] rename sendHomePage function to loadHomePage --- src/SEQTA.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/SEQTA.ts b/src/SEQTA.ts index 11dfb199..e5c57694 100644 --- a/src/SEQTA.ts +++ b/src/SEQTA.ts @@ -1193,7 +1193,7 @@ async function AddBetterSEQTAElements(toggle: any) { const menuCover = document.querySelector('#icon-cover') menuCover!.addEventListener('click', function () { location.href = '../#?page=/home' - SendHomePage(); + loadHomePage(); (document! .getElementById('menu')! .firstChild! as HTMLElement).classList.remove('noscroll') @@ -1202,7 +1202,7 @@ async function AddBetterSEQTAElements(toggle: any) { const homebutton = document.getElementById('homebutton') homebutton!.addEventListener('click', function () { if (!MenuOptionsOpen) { - SendHomePage() + loadHomePage() } }) @@ -2130,7 +2130,7 @@ function AddCustomShortcutsToPage() { result.then(open, onError) } -async function SendHomePage() { +async function loadHomePage() { // Sends the html data for the home page console.log('[BetterSEQTA] Started Loading Home Page') document.title = 'Home ― SEQTA Learn' @@ -2718,7 +2718,7 @@ function LoadInit() { const result = browser.storage.local.get() function open (result: any) { if (result.onoff) { - SendHomePage() + loadHomePage() } } result.then(open, onError) From 1e8de15801eeaf97a5ce7f9ac5b327c7a1a2a8c4 Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Wed, 27 Dec 2023 09:47:20 +1100 Subject: [PATCH 26/46] migrations to parcel --- .eslintrc.json | 19 ++++- .gitignore | 3 + .postcssrc.json | 5 ++ manifest.json | 22 +++--- package.json | 34 ++++++--- postcss.config.cjs | 6 -- src/SEQTA.ts | 72 +++++++++--------- src/css/injected.scss | 34 ++++++--- src/declarations.d.ts | 5 ++ src/interface/index.html | 1 - .../resources}/fonts/IconFamily.css | 0 .../resources}/fonts/IconFamily.woff | Bin .../icons/betterseqta-dark-full.png | Bin .../icons/betterseqta-dark-icon.png | Bin .../icons/betterseqta-light-full.png | Bin .../icons/betterseqta-light-icon.png | Bin .../icons/betterseqta-light-outline.png | Bin {public => src/resources}/icons/icon-32.png | Bin {public => src/resources}/icons/icon-48.png | Bin {public => src/resources}/icons/icon-64.png | Bin {public => src}/resources/update-video.mp4 | Bin src/seqta/ui/colors/Manager.ts | 15 ++-- src/seqta/utils/StorageListener.ts | 1 - vite.config.js | 14 ---- 24 files changed, 130 insertions(+), 101 deletions(-) create mode 100644 .postcssrc.json delete mode 100644 postcss.config.cjs create mode 100644 src/declarations.d.ts rename {public => src/resources}/fonts/IconFamily.css (100%) rename {public => src/resources}/fonts/IconFamily.woff (100%) rename {public => src/resources}/icons/betterseqta-dark-full.png (100%) rename {public => src/resources}/icons/betterseqta-dark-icon.png (100%) rename {public => src/resources}/icons/betterseqta-light-full.png (100%) rename {public => src/resources}/icons/betterseqta-light-icon.png (100%) rename {public => src/resources}/icons/betterseqta-light-outline.png (100%) rename {public => src/resources}/icons/icon-32.png (100%) rename {public => src/resources}/icons/icon-48.png (100%) rename {public => src/resources}/icons/icon-64.png (100%) rename {public => src}/resources/update-video.mp4 (100%) delete mode 100644 vite.config.js diff --git a/.eslintrc.json b/.eslintrc.json index 2b4f6c4e..ed490983 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -10,5 +10,22 @@ "ecmaVersion": "latest", "sourceType": "module" // add this line to allow 'import' and 'export' statements }, - "rules": {} + "rules": { + // allow importing ts extensions + "sort-imports": ["error", { + "ignoreCase": true, + "ignoreDeclarationSort": true, + "ignoreMemberSort": false, + "memberSyntaxSortOrder": ["none", "all", "multiple", "single"] + }], + "import/extensions": [ + "error", + "ignorePackages", + { + "js": "never", + "ts": "never", + "tsx": "never" + } + ] + } } \ No newline at end of file diff --git a/.gitignore b/.gitignore index 9ce31bc0..0c9c0154 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,9 @@ node_modules/ package-lock.json bun.lockb pnpm-lock.yaml +yarn.lock + +.parcel-cache # Build package.zip diff --git a/.postcssrc.json b/.postcssrc.json new file mode 100644 index 00000000..d42c370f --- /dev/null +++ b/.postcssrc.json @@ -0,0 +1,5 @@ +{ + "plugins": { + "tailwindcss": {} + } +} \ No newline at end of file diff --git a/manifest.json b/manifest.json index 77b76387..530f15e2 100644 --- a/manifest.json +++ b/manifest.json @@ -4,23 +4,24 @@ "version": "3.2.2", "description": "Make SEQTA usable and beautiful! A fork of BetterSEQTA to continue development and add WAY more features!!!", "icons": { - "32": "icons/icon-32.png", - "48": "icons/icon-48.png", - "64": "icons/icon-64.png" + "32": "src/resources/icons/icon-32.png", + "48": "src/resources/icons/icon-48.png", + "64": "src/resources/icons/icon-64.png" }, "action": { "browser_style": true, "default_popup": "src/interface/index.html#settings", "default_icon": { - "32": "icons/icon-32.png", - "48": "icons/icon-48.png", - "64": "icons/icon-64.png" + "32": "src/resources/icons/icon-32.png", + "48": "src/resources/icons/icon-48.png", + "64": "src/resources/icons/icon-64.png" } }, "permissions": ["tabs", "notifications", "storage"], "host_permissions": ["https://newsapi.org/", "*://*/*"], "background": { - "service_worker": "src/background.ts" + "service_worker": "src/background.ts", + "type": "module" }, "content_scripts": [ { @@ -32,11 +33,8 @@ "web_accessible_resources": [ { "resources": [ - "icons/*", - "fonts/*", - "images/*", - "resources/*", - "backgrounds/*" + "public/*", + "src/*" ], "matches": ["*://*/*"] } diff --git a/package.json b/package.json index 23a8b4fe..603fd43c 100644 --- a/package.json +++ b/package.json @@ -3,8 +3,9 @@ "version": "3.2.2", "type": "module", "description": "BetterSEQTA+ is a browser extension that adds features to SEQTA.", - "main": "webpack.config.js", "scripts": { + "start": "parcel watch manifest.json --host localhost --config @parcel/config-webextension", + "build-test": "parcel build manifest.json --config @parcel/config-webextension", "build": "vite build", "dev": "vite dev", "build-old": "webpack --config webpack.config.js --mode production && sh ./package.sh", @@ -16,22 +17,31 @@ "license": "MIT", "devDependencies": { "@crxjs/vite-plugin": "latest", - "copy-webpack-plugin": "^11.0.0", - "css-loader": "^6.8.1", - "dompurify": "^3.0.6", + "@parcel/config-webextension": "^2.10.3", + "@parcel/optimizer-data-url": "2.10.3", + "@parcel/transformer-inline-string": "2.10.3", + "@parcel/transformer-sass": "2.10.3", + "assert": "^2.0.0", + "browserify-zlib": "^0.2.0", + "crypto-browserify": "^3.12.0", "eslint": "^8.48.0", "eslint-config-prettier": "^9.0.0", "eslint-webpack-plugin": "^4.0.1", - "file-loader": "^6.2.0", - "mini-css-extract-plugin": "^2.7.6", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "parcel": "^2.10.3", + "path-browserify": "^1.0.0", "prettier": "3.0.2", + "querystring-es3": "^0.2.1", "sass": "^1.69.5", "sass-loader": "^13.3.2", + "stream-browserify": "^3.0.0", + "stream-http": "^3.1.0", "style-loader": "^3.3.3", - "vite": "^5.0.10", - "webextension-polyfill": "^0.10.0", - "webpack": "^5.88.2", - "webpack-cli": "^5.1.4" + "tty-browserify": "^0.0.1", + "url": "^0.11.0", + "util": "^0.12.3", + "yarn": "^1.22.21" }, "dependencies": { "@sentry/browser": "^7.85.0", @@ -45,6 +55,7 @@ "@types/webextension-polyfill": "^0.10.7", "autoprefixer": "^10.4.15", "color": "^4.2.3", + "dompurify": "^3.0.6", "framer-motion": "^10.16.16", "install": "^0.13.0", "localforage": "^1.10.0", @@ -58,6 +69,7 @@ "sortablejs": "^1.15.0", "tailwindcss": "^3.3.3", "ts-loader": "^9.5.1", - "typescript": "^5.2.2" + "typescript": "^5.2.2", + "webextension-polyfill": "^0.10.0" } } diff --git a/postcss.config.cjs b/postcss.config.cjs deleted file mode 100644 index 34b1c5eb..00000000 --- a/postcss.config.cjs +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - plugins: [ - require("tailwindcss"), - require("autoprefixer"), - ], -}; \ No newline at end of file diff --git a/src/SEQTA.ts b/src/SEQTA.ts index e5c57694..b1c75c2f 100644 --- a/src/SEQTA.ts +++ b/src/SEQTA.ts @@ -3,6 +3,14 @@ import * as Sentry from "@sentry/browser" import { animate, spring, stagger } from 'motion' import loading, { AppendLoadingSymbol } from './seqta/ui/Loading' +import updateVideo from 'url:./resources/update-video.mp4' +import IconFamily from 'url:./resources/fonts/IconFamily.woff' +import LogoLight from 'url:./resources/icons/betterseqta-light-icon.png' +import LogoLightOutline from 'url:./resources/icons/betterseqta-light-outline.png' +import icon48 from 'url:./resources/icons/icon-48.png' + +import Popup from 'url:./interface/index.html' + import Color from 'color' import MenuitemSVGKey from './seqta/content/MenuItemSVGKey.json' import { MessageHandler } from './seqta/utils/MessageListener' @@ -16,7 +24,7 @@ import browser from 'webextension-polyfill' import coursesicon from './seqta/icons/coursesIcon' import { delay } from "./seqta/utils/delay" import { enableCurrentTheme } from './seqta/ui/Themes' -import iframeCSS from "./css/iframe.scss?inline" +import iframeCSS from "url:./css/iframe.scss" import { onError } from './seqta/utils/onError' import stringToHTML from './seqta/utils/stringToHTML' import { updateAllColors } from './seqta/ui/colors/Manager' @@ -53,7 +61,8 @@ document.addEventListener( import('./css/injected.scss') import('./css/documentload.scss') - /* const link = GetCSSElement() + + /* const link = GetCSSElement() document.getElementsByTagName('html')[0].appendChild(link); */ enableCurrentTheme() @@ -123,7 +132,7 @@ function OpenWhatsNewPopup() { imagecont.classList.add('whatsnewImgContainer') let video = document.createElement('video') let source = document.createElement('source') - source.setAttribute('src', browser.runtime.getURL('resources/update-video.mp4')) + source.setAttribute('src', updateVideo) source.setAttribute('type', 'video/mp4') video.autoplay = true video.muted = true @@ -253,7 +262,7 @@ function OpenWhatsNewPopup() { { easing: spring({ stiffness: 220, damping: 18 }) } ) - animate( + /* animate( '.whatsnewTextContainer *', { opacity: [0, 1], y: [10, 0] }, { @@ -261,7 +270,7 @@ function OpenWhatsNewPopup() { duration: 0.5, easing: [.22, .03, .26, 1] } - ) + ) */ browser.storage.local.remove(['justupdated']) @@ -280,6 +289,7 @@ function OpenWhatsNewPopup() { async function finishLoad() { try { + document.querySelector('.legacy-root')!.classList.remove('hidden') var loadingbk = document.getElementById('loading') loadingbk!.style.opacity = '0' await delay(501) @@ -366,7 +376,7 @@ export function waitForElm(selector: any) { }) } -export function GetCSSElement (file: string) { +export function GetCSSElement(file: string) { const cssFile = browser.runtime.getURL(file) const fileref = document.createElement('link') fileref.setAttribute('rel', 'stylesheet') @@ -678,6 +688,8 @@ function main(storedSetting: SettingsState) { console.log('[BetterSEQTA+] Enabled') if (DarkMode) document.documentElement.classList.add('dark') + document.querySelector('.legacy-root')?.classList.add('hidden') + new StorageListener() new MessageHandler() @@ -697,14 +709,13 @@ function main(storedSetting: SettingsState) { function InjectCustomIcons() { console.log('[BetterSEQTA+] Injecting Icons') - const fontURL = browser.runtime.getURL('fonts/IconFamily.woff') const style = document.createElement('style') style.setAttribute('type', 'text/css') style.innerHTML = ` @font-face { font-family: 'IconFamily'; - src: url('${fontURL}') format('woff'); + src: url('${IconFamily}') format('woff'); font-weight: normal; font-style: normal; }` @@ -790,7 +801,7 @@ function addExtensionSettings() { document.body.appendChild(extensionPopup) const extensionIframe: HTMLIFrameElement = document.createElement('iframe') - extensionIframe.src = `${browser.runtime.getURL('src/interface/index.html')}#settings/embedded` + extensionIframe.src = `${Popup}#settings/embedded` extensionIframe.id = 'ExtensionIframe' extensionIframe.setAttribute('allowTransparency', 'true') extensionIframe.setAttribute('excludeDarkCheck', 'true') @@ -1600,13 +1611,14 @@ function callHomeTimetable(date: string, change?: any) { }) } } else { - console.log(DayContainer) - if (DayContainer.innerText || change) { - DayContainer.innerText = '' + if (DayContainer == null) { + + } else (!DayContainer.innerHTML || change); { + DayContainer.innerHTML = '' var dummyDay = document.createElement('div') dummyDay.classList.add('day-empty') let img = document.createElement('img') - img.src = browser.runtime.getURL('icons/betterseqta-light-icon.png') + img.src = LogoLight let text = document.createElement('p') text.innerText = 'No lessons available.' dummyDay.append(img) @@ -2141,12 +2153,10 @@ async function loadHomePage() { // Remove all current elements in the main div to add new elements var main = document.getElementById('main') - main!.innerHTML = '' + main!.innerHTML = ''; - const titlediv = document.getElementById('title')!.firstChild; - ((titlediv!) as HTMLElement).innerHTML = 'Home'; - (document.querySelector('link[rel*="icon"]')! as HTMLLinkElement).href = - browser.runtime.getURL('icons/icon-48.png') + const icon = document.querySelector('link[rel*="icon"]')! as HTMLLinkElement + icon.href = icon48 currentSelectedDate = new Date() @@ -2154,36 +2164,30 @@ async function loadHomePage() { var html = stringToHTML('
    ') // Appends the html file to main div - // Note : firstChild of html is done due to needing to grab the body from the stringToHTML function + // Note: firstChild of html is done due to needing to grab the body from the stringToHTML function main!.append(html.firstChild!) // Gets the current date const date = new Date() // Formats the current date used send a request for timetable and notices later - var TodayFormatted = + const TodayFormatted = date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + (date.getDate() < 10 ? '0' : '') + date.getDate() - // Replaces actual date with a selected date. Used for testing. - // TodayFormatted = "2020-08-31" // Creates the shortcut container into the home container - var ShortcutStr = '
    ' - var Shortcut = stringToHTML(ShortcutStr) + const Shortcut = stringToHTML('
    ') // Appends the shortcut container into the home container document.getElementById('home-container')!.append(Shortcut.firstChild!) // Creates the container div for the timetable portion of the home page - var TimetableStr = '

    Today\'s Lessons

    ' - var Timetable = stringToHTML(TimetableStr) + const Timetable = stringToHTML('

    Today\'s Lessons

    ') // Appends the timetable container into the home container document.getElementById('home-container')!.append(Timetable.firstChild!) callHomeTimetable(TodayFormatted, true) - var timetablearrowback = document.getElementById('home-timetable-back') - var timetablearrowforward = document.getElementById( - 'home-timetable-forward', - ) + const timetablearrowback = document.getElementById('home-timetable-back') + const timetablearrowforward = document.getElementById('home-timetable-forward') function SetTimetableSubtitle() { var homelessonsubtitle = document.getElementById('home-lesson-subtitle') @@ -2287,7 +2291,7 @@ async function loadHomePage() { // Appends the shortcut container into the home container document.getElementById('home-container')!.append(Notices.firstChild!) - animate( + /* animate( '.home-container > div', { opacity: [0, 1], y: [10, 0] }, { @@ -2295,7 +2299,7 @@ async function loadHomePage() { duration: 0.6, easing: [.22, .03, .26, 1] } - ) + ) */ callHomeTimetable(TodayFormatted) @@ -2634,9 +2638,7 @@ function SendNewsPage() { articleimage.classList.add('articleimage') if (newsarticles[i].urlToImage == 'null') { - articleimage.style.backgroundImage = `url(${browser.runtime.getURL( - 'icons/betterseqta-light-outline.png', - )})` + articleimage.style.backgroundImage = `url(${LogoLightOutline})` articleimage.style.width = '20%' articleimage.style.margin = '0 7.5%' } else { diff --git a/src/css/injected.scss b/src/css/injected.scss index 98dc28a1..889bb7dd 100644 --- a/src/css/injected.scss +++ b/src/css/injected.scss @@ -1,16 +1,19 @@ @charset "UTF-8"; -@import url("https://fonts.googleapis.com/css?family=Rubik:300,400,500,600"); +@import url('https://fonts.googleapis.com/css?family=Rubik:300,400,500,600'); -@import "./injected/popup.scss"; -@import "./injected/sidebar-animation.scss"; -@import "./injected/theme.scss"; -@import "./injected/transparency.scss"; +@import './injected/popup.scss'; +@import './injected/sidebar-animation.scss'; +@import './injected/theme.scss'; +@import './injected/transparency.scss'; :root { background: var(--better-main) !important; --navy: #1a1a1a !important; --auto-background: var(--better-pale, var(--background-secondary)) !important; } +.hidden { + display: none; +} body, html { font-family: Rubik, sans-serif !important; @@ -167,9 +170,6 @@ ul.magicDelete > li.deleting { background: transparent !important; color: var(--text-color) !important; } -.tooltip { - z-index: 5 !important; -} #menu li, #menu section { @@ -321,7 +321,7 @@ ol:has(.MessageList__avatar___2wxyb svg) { box-shadow: 0px 10px 15px -3px rgba(0, 0, 0, 0.2) !important; } -[style="--better-sub: #161616; --better-alert-highlight: #c61851; --background-primary: #ffffff; --background-secondary: #e5e7eb; --text-primary: black; --text-color: white; --betterseqta-logo: url(chrome-extension://boikofabjaholheekefimfojfncpjfib/icons/betterseqta-light-full.png); --better-main: #1a1a1a; --better-light: #333333;"] .menuShown > :last-child +[style="--better-sub: #161616; --better-alert-highlight: #c61851; --background-primary: #ffffff; --background-secondary: #e5e7eb; --text-primary: black; --text-color: white; --better-main: #1a1a1a; --better-light: #333333;"] .menuShown > :last-child { top: 18% !important; } @@ -526,7 +526,7 @@ div > ol:has(.uiFileHandlerWrapper) { width: 280px; // TODO: I know its 10px larger than its parent, but for some reason there is a 10px right padding that doesn't show up properly in devtools??? } .student #menu > ul::before { - background-image: var(--betterseqta-logo); + background-image: url(data-url:../resources/icons/betterseqta-dark-full.png); position: -webkit-sticky; position: sticky; top: 0; @@ -534,6 +534,10 @@ div > ol:has(.uiFileHandlerWrapper) { height: 69.5px; box-shadow: 0px 0px 4px 2px rgba(0, 0, 0, 0.2); } +.dark .student #menu > ul::before { + background-image: url(data-url:../resources/icons/betterseqta-light-full.png); +} + .assessmentsWrapper .message { display: none; } @@ -681,8 +685,12 @@ div > ol:has(.uiFileHandlerWrapper) { left: 0; width: 100%; } +.dark #title::before { + background-image: url(data-url:../resources/icons/betterseqta-light-full.png); +} + #title::before { - background-image: var(--betterseqta-logo); + background-image: url(data-url:../resources/icons/betterseqta-dark-full.png); background-position: left; background-repeat: no-repeat; background-size: auto 48px; @@ -1674,7 +1682,7 @@ li.MessageList__unread___3imtO { content: ""; width: 14px; height: 12px; - background-image: url("../../public/icons/betterseqta-light-outline.png"); + background-image: url("data-url:../resources/icons/betterseqta-light-outline.png"); display: inline-block; background-size: 18px 18px; color: #fff; @@ -2528,6 +2536,8 @@ li.MessageList__unread___3imtO { } .tooltip { display: inline-block; + background: transparent; + z-index: 5 !important; width: 28px; background: none; box-shadow: none; diff --git a/src/declarations.d.ts b/src/declarations.d.ts new file mode 100644 index 00000000..7a800f22 --- /dev/null +++ b/src/declarations.d.ts @@ -0,0 +1,5 @@ +declare module '*.mp4'; +declare module '*.woff'; +declare module '*.scss'; +declare module '*.png'; +declare module '*.html'; diff --git a/src/interface/index.html b/src/interface/index.html index 9d2a4017..5e81ff37 100644 --- a/src/interface/index.html +++ b/src/interface/index.html @@ -2,7 +2,6 @@ - Vite + React + TS diff --git a/public/fonts/IconFamily.css b/src/resources/fonts/IconFamily.css similarity index 100% rename from public/fonts/IconFamily.css rename to src/resources/fonts/IconFamily.css diff --git a/public/fonts/IconFamily.woff b/src/resources/fonts/IconFamily.woff similarity index 100% rename from public/fonts/IconFamily.woff rename to src/resources/fonts/IconFamily.woff diff --git a/public/icons/betterseqta-dark-full.png b/src/resources/icons/betterseqta-dark-full.png similarity index 100% rename from public/icons/betterseqta-dark-full.png rename to src/resources/icons/betterseqta-dark-full.png diff --git a/public/icons/betterseqta-dark-icon.png b/src/resources/icons/betterseqta-dark-icon.png similarity index 100% rename from public/icons/betterseqta-dark-icon.png rename to src/resources/icons/betterseqta-dark-icon.png diff --git a/public/icons/betterseqta-light-full.png b/src/resources/icons/betterseqta-light-full.png similarity index 100% rename from public/icons/betterseqta-light-full.png rename to src/resources/icons/betterseqta-light-full.png diff --git a/public/icons/betterseqta-light-icon.png b/src/resources/icons/betterseqta-light-icon.png similarity index 100% rename from public/icons/betterseqta-light-icon.png rename to src/resources/icons/betterseqta-light-icon.png diff --git a/public/icons/betterseqta-light-outline.png b/src/resources/icons/betterseqta-light-outline.png similarity index 100% rename from public/icons/betterseqta-light-outline.png rename to src/resources/icons/betterseqta-light-outline.png diff --git a/public/icons/icon-32.png b/src/resources/icons/icon-32.png similarity index 100% rename from public/icons/icon-32.png rename to src/resources/icons/icon-32.png diff --git a/public/icons/icon-48.png b/src/resources/icons/icon-48.png similarity index 100% rename from public/icons/icon-48.png rename to src/resources/icons/icon-48.png diff --git a/public/icons/icon-64.png b/src/resources/icons/icon-64.png similarity index 100% rename from public/icons/icon-64.png rename to src/resources/icons/icon-64.png diff --git a/public/resources/update-video.mp4 b/src/resources/update-video.mp4 similarity index 100% rename from public/resources/update-video.mp4 rename to src/resources/update-video.mp4 diff --git a/src/seqta/ui/colors/Manager.ts b/src/seqta/ui/colors/Manager.ts index 43f49ba6..4667f499 100644 --- a/src/seqta/ui/colors/Manager.ts +++ b/src/seqta/ui/colors/Manager.ts @@ -1,9 +1,11 @@ import browser from 'webextension-polyfill' -import { GetThresholdOfColor, GetCSSElement } from '../../../SEQTA'; +import { GetThresholdOfColor } from '../../../SEQTA'; import { lightenAndPaleColor } from './lightenAndPaleColor'; import ColorLuminance from './ColorLuminance'; import { SettingsState } from '../../../types/storage'; +import iFrameCSS from 'url:../../../css/iframe.scss'; + // Helper functions const setCSSVar = (varName: any, value: any) => document.documentElement.style.setProperty(varName, value); const getChromeURL = (path: any) => browser.runtime.getURL(path); @@ -35,12 +37,9 @@ export function updateAllColors(storedSetting: any, newColor = null) { // Mode-based properties, applied if storedSetting is provided let modeProps = {}; if (DarkMode !== null) { - modeProps = DarkMode ? { - '--betterseqta-logo': `url(${getChromeURL('icons/betterseqta-light-full.png')})` - } : { - '--better-pale': lightenAndPaleColor(selectedColor), - '--betterseqta-logo': `url(${getChromeURL('icons/betterseqta-dark-full.png')})` - }; + if (!DarkMode) { + modeProps = { '--better-pale': lightenAndPaleColor(selectedColor) }; + } if (DarkMode) { document.documentElement.style.removeProperty('--better-pale'); @@ -67,7 +66,7 @@ export function updateAllColors(storedSetting: any, newColor = null) { } let alliframes = document.getElementsByTagName('iframe'); - let fileref = GetCSSElement('css/iframe.css'); + let fileref = iFrameCSS; for (let i = 0; i < alliframes.length; i++) { const element = alliframes[i]; diff --git a/src/seqta/utils/StorageListener.ts b/src/seqta/utils/StorageListener.ts index 9111fc17..75553bca 100644 --- a/src/seqta/utils/StorageListener.ts +++ b/src/seqta/utils/StorageListener.ts @@ -45,7 +45,6 @@ export default class StorageListener { case 'DarkMode': this.darkMode = changes.DarkMode.newValue; - console.log(this.darkMode); break; case 'customshortcuts': diff --git a/vite.config.js b/vite.config.js deleted file mode 100644 index 934fd28f..00000000 --- a/vite.config.js +++ /dev/null @@ -1,14 +0,0 @@ -import { crx } from '@crxjs/vite-plugin' -import { defineConfig } from 'vite' -import manifest from './manifest.json' - -export default defineConfig({ - plugins: [crx({ manifest })], - server: { - port: 3004, - hmr: { - port: 8989, - overlay: false, - } - } -}) \ No newline at end of file From 1fa2ec93a61256cc0df74ceded44d0ee82714cb4 Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Thu, 28 Dec 2023 07:21:24 +1100 Subject: [PATCH 27/46] remove vite crx-js --- package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/package.json b/package.json index 603fd43c..3cc0a0e8 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,6 @@ "author": "", "license": "MIT", "devDependencies": { - "@crxjs/vite-plugin": "latest", "@parcel/config-webextension": "^2.10.3", "@parcel/optimizer-data-url": "2.10.3", "@parcel/transformer-inline-string": "2.10.3", From c79f4407dfa8f0ab58d9b90ddc8ef09b05554abf Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Thu, 28 Dec 2023 07:28:47 +1100 Subject: [PATCH 28/46] refactor package-json scripts --- package.json | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 3cc0a0e8..a1f67ebf 100644 --- a/package.json +++ b/package.json @@ -5,11 +5,7 @@ "description": "BetterSEQTA+ is a browser extension that adds features to SEQTA.", "scripts": { "start": "parcel watch manifest.json --host localhost --config @parcel/config-webextension", - "build-test": "parcel build manifest.json --config @parcel/config-webextension", - "build": "vite build", - "dev": "vite dev", - "build-old": "webpack --config webpack.config.js --mode production && sh ./package.sh", - "dev-old": "webpack --config webpack.config.js --watch --mode development", + "build": "parcel build manifest.json --config @parcel/config-webextension", "eslint": "eslint --fix ." }, "keywords": [], @@ -31,6 +27,7 @@ "parcel": "^2.10.3", "path-browserify": "^1.0.0", "prettier": "3.0.2", + "process": "^0.11.10", "querystring-es3": "^0.2.1", "sass": "^1.69.5", "sass-loader": "^13.3.2", From 40cb7f2b341a4d117a94b005155405e4370076dd Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Mon, 15 Jan 2024 17:04:12 +1100 Subject: [PATCH 29/46] bug fixes to help with build --- src/SEQTA.ts | 18 ++++++++++++++++-- src/css/injected.scss | 11 ++++------- src/seqta/ui/colors/Manager.ts | 11 ++++++++--- 3 files changed, 28 insertions(+), 12 deletions(-) diff --git a/src/SEQTA.ts b/src/SEQTA.ts index b1c75c2f..ae9ecca6 100644 --- a/src/SEQTA.ts +++ b/src/SEQTA.ts @@ -30,6 +30,10 @@ import stringToHTML from './seqta/utils/stringToHTML' import { updateAllColors } from './seqta/ui/colors/Manager' import { updateBgDurations } from './seqta/ui/Animation' +/* import injected from 'url:./css/injected.scss'; + */ /* import documentLoad from 'url:./css/documentload.scss'; */ + + declare global { interface Window { chrome?: any @@ -62,8 +66,18 @@ document.addEventListener( import('./css/injected.scss') import('./css/documentload.scss') - /* const link = GetCSSElement() - document.getElementsByTagName('html')[0].appendChild(link); */ + /* const injectedCSS = document.createElement('link') + injectedCSS.setAttribute('rel', 'stylesheet') + injectedCSS.setAttribute('type', 'text/css') + injectedCSS.setAttribute('href', injected) */ + + /* const documentLoadCSS = document.createElement('link') + documentLoadCSS.setAttribute('rel', 'stylesheet') + documentLoadCSS.setAttribute('type', 'text/css') + documentLoadCSS.setAttribute('href', documentLoad) */ + + /* document.head.appendChild(documentLoadCSS) */ + /* document.head.appendChild(injectedCSS) */ enableCurrentTheme() try { diff --git a/src/css/injected.scss b/src/css/injected.scss index 889bb7dd..5f314755 100644 --- a/src/css/injected.scss +++ b/src/css/injected.scss @@ -525,7 +525,7 @@ div > ol:has(.uiFileHandlerWrapper) { #menu ul { width: 280px; // TODO: I know its 10px larger than its parent, but for some reason there is a 10px right padding that doesn't show up properly in devtools??? } -.student #menu > ul::before { +/* .student #menu > ul::before { background-image: url(data-url:../resources/icons/betterseqta-dark-full.png); position: -webkit-sticky; position: sticky; @@ -536,7 +536,7 @@ div > ol:has(.uiFileHandlerWrapper) { } .dark .student #menu > ul::before { background-image: url(data-url:../resources/icons/betterseqta-light-full.png); -} +} */ .assessmentsWrapper .message { display: none; @@ -685,12 +685,9 @@ div > ol:has(.uiFileHandlerWrapper) { left: 0; width: 100%; } -.dark #title::before { - background-image: url(data-url:../resources/icons/betterseqta-light-full.png); -} #title::before { - background-image: url(data-url:../resources/icons/betterseqta-dark-full.png); + background-image: var(--betterseqta-logo); background-position: left; background-repeat: no-repeat; background-size: auto 48px; @@ -1682,7 +1679,7 @@ li.MessageList__unread___3imtO { content: ""; width: 14px; height: 12px; - background-image: url("data-url:../resources/icons/betterseqta-light-outline.png"); + background-image: url("../resources/icons/betterseqta-light-outline.png"); display: inline-block; background-size: 18px 18px; color: #fff; diff --git a/src/seqta/ui/colors/Manager.ts b/src/seqta/ui/colors/Manager.ts index 4667f499..73f8f020 100644 --- a/src/seqta/ui/colors/Manager.ts +++ b/src/seqta/ui/colors/Manager.ts @@ -4,6 +4,8 @@ import { lightenAndPaleColor } from './lightenAndPaleColor'; import ColorLuminance from './ColorLuminance'; import { SettingsState } from '../../../types/storage'; +import darkLogo from 'url:../../../resources/icons/betterseqta-light-full.png'; +import lightLogo from 'url:../../../resources/icons/betterseqta-dark-full.png'; import iFrameCSS from 'url:../../../css/iframe.scss'; // Helper functions @@ -37,9 +39,12 @@ export function updateAllColors(storedSetting: any, newColor = null) { // Mode-based properties, applied if storedSetting is provided let modeProps = {}; if (DarkMode !== null) { - if (!DarkMode) { - modeProps = { '--better-pale': lightenAndPaleColor(selectedColor) }; - } + modeProps = DarkMode ? { + '--betterseqta-logo': `url(${darkLogo})` + } : { + '--better-pale': lightenAndPaleColor(selectedColor), + '--betterseqta-logo': `url(${lightLogo})` + }; if (DarkMode) { document.documentElement.style.removeProperty('--better-pale'); From cd6a5373e895de082268d5ca350ab2f94f2e4ca6 Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Wed, 24 Jan 2024 08:47:54 +1100 Subject: [PATCH 30/46] bug: major bug fixes and smoothing --- chrome/manifest.json | 42 ++++++ firefox/manifest.json | 37 +++++ package.json | 6 +- src/SEQTA.ts | 127 ++++++++++++------ src/seqta/ui/ImageBackgrounds.ts | 4 +- .../seqta/ui/background}/background.html | 2 +- .../seqta/ui/background/background.ts | 46 ++++--- 7 files changed, 198 insertions(+), 66 deletions(-) create mode 100644 chrome/manifest.json create mode 100644 firefox/manifest.json rename {public/backgrounds => src/seqta/ui/background}/background.html (91%) rename public/backgrounds/background.js => src/seqta/ui/background/background.ts (68%) diff --git a/chrome/manifest.json b/chrome/manifest.json new file mode 100644 index 00000000..530f15e2 --- /dev/null +++ b/chrome/manifest.json @@ -0,0 +1,42 @@ +{ + "manifest_version": 3, + "name": "BetterSEQTA+", + "version": "3.2.2", + "description": "Make SEQTA usable and beautiful! A fork of BetterSEQTA to continue development and add WAY more features!!!", + "icons": { + "32": "src/resources/icons/icon-32.png", + "48": "src/resources/icons/icon-48.png", + "64": "src/resources/icons/icon-64.png" + }, + "action": { + "browser_style": true, + "default_popup": "src/interface/index.html#settings", + "default_icon": { + "32": "src/resources/icons/icon-32.png", + "48": "src/resources/icons/icon-48.png", + "64": "src/resources/icons/icon-64.png" + } + }, + "permissions": ["tabs", "notifications", "storage"], + "host_permissions": ["https://newsapi.org/", "*://*/*"], + "background": { + "service_worker": "src/background.ts", + "type": "module" + }, + "content_scripts": [ + { + "matches": ["*://*/*"], + "js": ["src/SEQTA.ts"], + "run_at": "document_start" + } + ], + "web_accessible_resources": [ + { + "resources": [ + "public/*", + "src/*" + ], + "matches": ["*://*/*"] + } + ] +} \ No newline at end of file diff --git a/firefox/manifest.json b/firefox/manifest.json new file mode 100644 index 00000000..e9633ce1 --- /dev/null +++ b/firefox/manifest.json @@ -0,0 +1,37 @@ +{ + "manifest_version": 2, + "name": "BetterSEQTA+", + "version": "3.2.2", + "description": "Make SEQTA usable and beautiful! A fork of BetterSEQTA to continue development and add WAY more features!!!", + "icons": { + "32": "../src/resources/icons/icon-32.png", + "48": "../src/resources/icons/icon-48.png", + "64": "../src/resources/icons/icon-64.png" + }, + "browser_action": { + "browser_style": true, + "default_popup": "../src/interface/index.html#settings", + "default_icon": { + "32": "../src/resources/icons/icon-32.png", + "48": "../src/resources/icons/icon-48.png", + "64": "../src/resources/icons/icon-64.png" + } + }, + "permissions": ["tabs", "notifications", "storage", "https://newsapi.org/"], + "background": { + "scripts": [ + "../src/background.ts" + ] + }, + "content_scripts": [ + { + "matches": ["*://*/*"], + "js": ["../src/SEQTA.ts"], + "run_at": "document_start" + } + ], + "web_accessible_resources": [ + "../src/*", + "../public/*" + ] +} \ No newline at end of file diff --git a/package.json b/package.json index a1f67ebf..931f561f 100644 --- a/package.json +++ b/package.json @@ -13,8 +13,8 @@ "license": "MIT", "devDependencies": { "@parcel/config-webextension": "^2.10.3", - "@parcel/optimizer-data-url": "2.10.3", - "@parcel/transformer-inline-string": "2.10.3", + "@parcel/optimizer-data-url": "^2.11.0", + "@parcel/transformer-inline-string": "^2.11.0", "@parcel/transformer-sass": "2.10.3", "assert": "^2.0.0", "browserify-zlib": "^0.2.0", @@ -26,7 +26,7 @@ "os-browserify": "^0.3.0", "parcel": "^2.10.3", "path-browserify": "^1.0.0", - "prettier": "3.0.2", + "prettier": "^3.2.2", "process": "^0.11.10", "querystring-es3": "^0.2.1", "sass": "^1.69.5", diff --git a/src/SEQTA.ts b/src/SEQTA.ts index ae9ecca6..b0fab448 100644 --- a/src/SEQTA.ts +++ b/src/SEQTA.ts @@ -1,6 +1,6 @@ import * as Sentry from "@sentry/browser" -import { animate, spring, stagger } from 'motion' +import { animate, spring, /* stagger */ } from 'motion' import loading, { AppendLoadingSymbol } from './seqta/ui/Loading' import updateVideo from 'url:./resources/update-video.mp4' @@ -370,24 +370,37 @@ export function RemoveBackground() { bk3[0].remove() } -export function waitForElm(selector: any) { +export function waitForElm(selector: string) { return new Promise((resolve) => { - if (document.querySelector(selector)) { - return resolve(document.querySelector(selector)) + const querySelector = () => document.querySelector(selector); + + if (querySelector()) { + return resolve(querySelector()); } const observer = new MutationObserver(() => { - if (document.querySelector(selector)) { - resolve(document.querySelector(selector)) - observer.disconnect() + if (querySelector()) { + resolve(querySelector()); + observer.disconnect(); } - }) + }); - observer.observe(document.body, { - childList: true, - subtree: true, - }) - }) + // 🛡️ Safety check: Ensure document.body is available + if (document.body) { + observer.observe(document.body, { + childList: true, + subtree: true, + }); + } else { + // 🚨 Fallback: Wait for the document to be ready + document.addEventListener('DOMContentLoaded', () => { + observer.observe(document.body, { + childList: true, + subtree: true, + }); + }); + } + }); } export function GetCSSElement(file: string) { @@ -440,7 +453,19 @@ async function updateIframesWithDarkMode(): Promise { } }) - observer.observe(document.body, { subtree: true, childList: true }) + if (document.body) { + observer.observe(document.body, { + childList: true, + subtree: true, + }); + } else { + document.addEventListener('DOMContentLoaded', () => { + observer.observe(document.body, { + childList: true, + subtree: true, + }); + }); + } } function applyDarkModeToIframe(iframe: HTMLIFrameElement, cssLink: HTMLStyleElement): void { @@ -806,8 +831,8 @@ export function closeSettings() { } function addExtensionSettings() { - const link = GetCSSElement('src/interface/popup.css') - document.querySelector('html')!.appendChild(link) + /* const link = GetCSSElement('src/interface/popup.css') + document.querySelector('html')!.appendChild(link) */ const extensionPopup = document.createElement('div') extensionPopup.classList.add('outside-container', 'hide') @@ -1189,14 +1214,16 @@ async function AddBetterSEQTAElements(toggle: any) { let houseelement1 = document.getElementsByClassName('userInfohouse')[0] const houseelement = houseelement1 as HTMLElement if (students[index]?.house) { - (houseelement as HTMLElement).style.background = students[index].house_colour - try { - let colorresult = GetThresholdOfColor(students[index]?.house_colour) - - houseelement.style.color = colorresult && colorresult > 300 ? 'black' : 'white' - houseelement.innerText = students[index].year + students[index].house - } catch (error) { - houseelement.innerText = students[index].house + if (students[index]?.house_colour) { + houseelement.style.background = students[index].house_colour + try { + let colorresult = GetThresholdOfColor(students[index]?.house_colour) + + houseelement.style.color = colorresult && colorresult > 300 ? 'black' : 'white' + houseelement.innerText = students[index].year + students[index].house + } catch (error) { + houseelement.innerText = students[index].house + } } } else { houseelement.innerText = students[index].year @@ -1626,19 +1653,20 @@ function callHomeTimetable(date: string, change?: any) { } } else { if (DayContainer == null) { - - } else (!DayContainer.innerHTML || change); { - DayContainer.innerHTML = '' - var dummyDay = document.createElement('div') - dummyDay.classList.add('day-empty') - let img = document.createElement('img') - img.src = LogoLight - let text = document.createElement('p') - text.innerText = 'No lessons available.' - dummyDay.append(img) - dummyDay.append(text) - DayContainer.append(dummyDay) + console.log('DayContainer is null') + //DayContainer = document.getElementById('day-container')! } + console.log(DayContainer); + DayContainer.innerHTML = '' + var dummyDay = document.createElement('div') + dummyDay.classList.add('day-empty') + let img = document.createElement('img') + img.src = LogoLight + let text = document.createElement('p') + text.innerText = 'No lessons available.' + dummyDay.append(img) + dummyDay.append(text) + DayContainer.append(dummyDay) } } } @@ -2160,14 +2188,20 @@ async function loadHomePage() { // Sends the html data for the home page console.log('[BetterSEQTA] Started Loading Home Page') document.title = 'Home ― SEQTA Learn' - var element = document.querySelector('[data-key=home]') + const element = document.querySelector('[data-key=home]') // Apply the active class to indicate clicked on home button element!.classList.add('active') // Remove all current elements in the main div to add new elements - var main = document.getElementById('main') - main!.innerHTML = ''; + const main = document.getElementById('main') + + if (!main) { + console.error('Main element not found.') + return + } + + //main.innerHTML = ''; const icon = document.querySelector('link[rel*="icon"]')! as HTMLLinkElement icon.href = icon48 @@ -2198,7 +2232,12 @@ async function loadHomePage() { const Timetable = stringToHTML('

    Today\'s Lessons

    ') // Appends the timetable container into the home container document.getElementById('home-container')!.append(Timetable.firstChild!) - callHomeTimetable(TodayFormatted, true) + if (document.getElementById('home-container')) { + callHomeTimetable(TodayFormatted, true) + } else { + console.error("HELP! THERE IS NO HOME CONTAINER") + } + const timetablearrowback = document.getElementById('home-timetable-back') const timetablearrowforward = document.getElementById('home-timetable-forward') @@ -2507,7 +2546,11 @@ async function loadHomePage() { activeClassList = classes[i] } } - let activeSubjects = activeClassList.subjects + + let activeSubjects = [] + if (activeClassList?.subjects) { + activeSubjects = activeClassList.subjects + } let activeSubjectCodes = [] @@ -2683,7 +2726,7 @@ function SendNewsPage() { async function CheckForMenuList() { if (!MenuItemMutation) { try { - if (document.getElementById('menu')!.firstChild) { + if (document.getElementById('menu')?.firstChild) { ObserveMenuItemPosition() MenuItemMutation = true } diff --git a/src/seqta/ui/ImageBackgrounds.ts b/src/seqta/ui/ImageBackgrounds.ts index 15782c9a..645e44d2 100644 --- a/src/seqta/ui/ImageBackgrounds.ts +++ b/src/seqta/ui/ImageBackgrounds.ts @@ -1,4 +1,4 @@ -import browser from 'webextension-polyfill' +import backgroundPage from 'url:./background/background.html' export async function appendBackgroundToUI() { console.log('Starting appendBackgroundToUI...'); @@ -10,6 +10,6 @@ export async function appendBackgroundToUI() { background.id = 'background'; background.classList.add('imageBackground'); background.setAttribute('excludeDarkCheck', 'true'); - background.src = browser.runtime.getURL('backgrounds/background.html'); + background.src = backgroundPage; parent!.appendChild(background); } diff --git a/public/backgrounds/background.html b/src/seqta/ui/background/background.html similarity index 91% rename from public/backgrounds/background.html rename to src/seqta/ui/background/background.html index cbf1a004..eeb2bc55 100644 --- a/public/backgrounds/background.html +++ b/src/seqta/ui/background/background.html @@ -24,6 +24,6 @@
    - + diff --git a/public/backgrounds/background.js b/src/seqta/ui/background/background.ts similarity index 68% rename from public/backgrounds/background.js rename to src/seqta/ui/background/background.ts index c5cdcf7b..71ac3f97 100644 --- a/public/backgrounds/background.js +++ b/src/seqta/ui/background/background.ts @@ -1,20 +1,31 @@ -// Open the database -const openDB = () => { +interface Data { + blob: Blob; + type: 'image' | 'video'; +} + +interface DatabaseEventTarget extends EventTarget { + result: IDBDatabase; +} + +interface DatabaseEvent extends Event { + target: DatabaseEventTarget; +} + +const openDB = (): Promise => { return new Promise((resolve, reject) => { const request = indexedDB.open('MyDatabase', 1); request.onerror = () => reject(request.error); request.onsuccess = () => resolve(request.result); - request.onupgradeneeded = (event) => { - const db = event.target.result; - db.createObjectStore('backgrounds', { keyPath: 'id' }); + request.onupgradeneeded = (event: IDBVersionChangeEvent) => { + // @ts-expect-error + event?.target?.result.createObjectStore('backgrounds', { keyPath: 'id' }); }; }); }; -// Modified Read Data from IndexedDB -const readData = async () => { +const readData = async (): Promise => { const selectedBackground = localStorage.getItem('selectedBackground'); if (!selectedBackground) { return null; @@ -25,20 +36,20 @@ const readData = async () => { const store = tx.objectStore('backgrounds'); const request = store.get(selectedBackground); - return await new Promise((resolve, reject) => { - request.onsuccess = () => resolve(request.result); + return new Promise((resolve, reject) => { + request.onsuccess = () => resolve(request.result as Data); request.onerror = () => reject(request.error); }); }; -const updateBackground = async () => { +const updateBackground = async (): Promise => { try { const data = await readData(); if (!data) { console.log('No data found in IndexedDB.'); const container = document.getElementById('media-container'); - const currentMedia = container.querySelector('.current-media'); + const currentMedia = container?.querySelector('.current-media'); if (currentMedia) { currentMedia.remove(); } @@ -63,19 +74,19 @@ const updateBackground = async () => { } // Mark the old element for removal - const oldElement = container.querySelector('.current-media'); + const oldElement = container?.querySelector('.current-media'); if (oldElement) { oldElement.classList.remove('current-media'); oldElement.classList.add('old-media'); } // Add the new element and mark it as current - newElement.classList.add('current-media'); - container.appendChild(newElement); + newElement?.classList.add('current-media'); + container?.appendChild(newElement as Node); // Delay removal of old element setTimeout(() => { - const oldMedia = container.querySelector('.old-media'); + const oldMedia = container?.querySelector('.old-media'); if (oldMedia) { oldMedia.remove(); } @@ -86,13 +97,12 @@ const updateBackground = async () => { }; // Main function to run on page load -const main = async () => { - await updateBackground(); // Initial background update +const main = async (): Promise => { + await updateBackground(); // Listen for changes to local storage window.addEventListener('storage', async (event) => { if (event.key === 'selectedBackground') { - await updateBackground(); // Update background if 'selectedBackground' changes } }); }; From 29a24d9d2ecea1afc8ef56e839fba166fcd7ea43 Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Wed, 24 Jan 2024 09:07:40 +1100 Subject: [PATCH 31/46] fix logo --- src/css/injected.scss | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/css/injected.scss b/src/css/injected.scss index 5f314755..4ef9e3d8 100644 --- a/src/css/injected.scss +++ b/src/css/injected.scss @@ -525,8 +525,8 @@ div > ol:has(.uiFileHandlerWrapper) { #menu ul { width: 280px; // TODO: I know its 10px larger than its parent, but for some reason there is a 10px right padding that doesn't show up properly in devtools??? } -/* .student #menu > ul::before { - background-image: url(data-url:../resources/icons/betterseqta-dark-full.png); +.student #menu > ul::before { + background-image: var(--betterseqta-logo); position: -webkit-sticky; position: sticky; top: 0; @@ -534,9 +534,6 @@ div > ol:has(.uiFileHandlerWrapper) { height: 69.5px; box-shadow: 0px 0px 4px 2px rgba(0, 0, 0, 0.2); } -.dark .student #menu > ul::before { - background-image: url(data-url:../resources/icons/betterseqta-light-full.png); -} */ .assessmentsWrapper .message { display: none; From a29177c7dfa88f9ffc963c4e79a5924a19b1111e Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Wed, 24 Jan 2024 09:40:30 +1100 Subject: [PATCH 32/46] fix build --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 931f561f..f7ee419e 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,8 @@ "description": "BetterSEQTA+ is a browser extension that adds features to SEQTA.", "scripts": { "start": "parcel watch manifest.json --host localhost --config @parcel/config-webextension", - "build": "parcel build manifest.json --config @parcel/config-webextension", + "build": "rm -r .parcel-cache; parcel build manifest.json --config @parcel/config-webextension --no-content-hash", + "build-unix": "rm -r .parcel-cache; parcel build manifest.json --config @parcel/config-webextension --no-content-hash", "eslint": "eslint --fix ." }, "keywords": [], From 6ff41d83b2e5bc371bb5ccc7738aa8c8d10ffd99 Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Wed, 24 Jan 2024 09:51:30 +1100 Subject: [PATCH 33/46] rename scripts --- package.json | 5 ++--- src/SEQTA.ts | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index f7ee419e..ea36f0d1 100644 --- a/package.json +++ b/package.json @@ -4,9 +4,8 @@ "type": "module", "description": "BetterSEQTA+ is a browser extension that adds features to SEQTA.", "scripts": { - "start": "parcel watch manifest.json --host localhost --config @parcel/config-webextension", - "build": "rm -r .parcel-cache; parcel build manifest.json --config @parcel/config-webextension --no-content-hash", - "build-unix": "rm -r .parcel-cache; parcel build manifest.json --config @parcel/config-webextension --no-content-hash", + "dev": "parcel watch manifest.json --host localhost --config @parcel/config-webextension", + "build": "parcel build manifest.json --config @parcel/config-webextension --no-content-hash", "eslint": "eslint --fix ." }, "keywords": [], diff --git a/src/SEQTA.ts b/src/SEQTA.ts index b0fab448..912c74eb 100644 --- a/src/SEQTA.ts +++ b/src/SEQTA.ts @@ -2201,7 +2201,7 @@ async function loadHomePage() { return } - //main.innerHTML = ''; + main.innerHTML = ''; const icon = document.querySelector('link[rel*="icon"]')! as HTMLLinkElement icon.href = icon48 From b4614378f3f486cfa9e29d9e2dd901ac823a1599 Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Wed, 24 Jan 2024 10:10:04 +1100 Subject: [PATCH 34/46] reformat homepage function --- src/SEQTA.ts | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/src/SEQTA.ts b/src/SEQTA.ts index 912c74eb..e2e546ca 100644 --- a/src/SEQTA.ts +++ b/src/SEQTA.ts @@ -2218,25 +2218,23 @@ async function loadHomePage() { // Gets the current date const date = new Date() - // Formats the current date used send a request for timetable and notices later - const TodayFormatted = - date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + (date.getDate() < 10 ? '0' : '') + date.getDate() - - + + // Creates the shortcut container into the home container const Shortcut = stringToHTML('
    ') // Appends the shortcut container into the home container document.getElementById('home-container')!.append(Shortcut.firstChild!) - + // Creates the container div for the timetable portion of the home page const Timetable = stringToHTML('

    Today\'s Lessons

    ') // Appends the timetable container into the home container document.getElementById('home-container')!.append(Timetable.firstChild!) - if (document.getElementById('home-container')) { - callHomeTimetable(TodayFormatted, true) - } else { - console.error("HELP! THERE IS NO HOME CONTAINER") - } + + // Formats the current date used send a request for timetable and notices later + const TodayFormatted = + date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + (date.getDate() < 10 ? '0' : '') + date.getDate() + + callHomeTimetable(TodayFormatted, true) const timetablearrowback = document.getElementById('home-timetable-back') From a6659218b49f2f1eb85b2c8a4f2cc7fe734d34ee Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Wed, 24 Jan 2024 10:14:34 +1100 Subject: [PATCH 35/46] fix: elements flow over sidebar --- src/css/injected.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/src/css/injected.scss b/src/css/injected.scss index 4ef9e3d8..7b641bc9 100644 --- a/src/css/injected.scss +++ b/src/css/injected.scss @@ -200,6 +200,7 @@ ul.magicDelete > li.deleting { } #menu { width: 270px; + z-index: 19; background: var(--better-main) !important; color: var(--text-color); border-right: none; From c2202b1247116d5d1312c84ad00b64b62b0e7615 Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Fri, 26 Jan 2024 09:05:16 +1100 Subject: [PATCH 36/46] fix home loading --- package.json | 2 +- src/SEQTA.ts | 27 +++++++++++++++------------ 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index ea36f0d1..1ca7e66d 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "@types/webextension-polyfill": "^0.10.7", "autoprefixer": "^10.4.15", "color": "^4.2.3", - "dompurify": "^3.0.6", + "dompurify": "^3.0.8", "framer-motion": "^10.16.16", "install": "^0.13.0", "localforage": "^1.10.0", diff --git a/src/SEQTA.ts b/src/SEQTA.ts index e2e546ca..4b6d59dd 100644 --- a/src/SEQTA.ts +++ b/src/SEQTA.ts @@ -1578,6 +1578,8 @@ function CheckUnmarkedAttendance(lessonattendance: any) { } function callHomeTimetable(date: string, change?: any) { + const DayContainer = document.getElementById('day-container')! + console.log("Daycontainer: ", DayContainer) // Creates a HTTP Post Request to the SEQTA page for the students timetable var xhr = new XMLHttpRequest() xhr.open('POST', `${location.origin}/seqta/student/load/timetable?`, true) @@ -1652,10 +1654,6 @@ function callHomeTimetable(date: string, change?: any) { }) } } else { - if (DayContainer == null) { - console.log('DayContainer is null') - //DayContainer = document.getElementById('day-container')! - } console.log(DayContainer); DayContainer.innerHTML = '' var dummyDay = document.createElement('div') @@ -2187,9 +2185,15 @@ function AddCustomShortcutsToPage() { async function loadHomePage() { // Sends the html data for the home page console.log('[BetterSEQTA] Started Loading Home Page') + document.title = 'Home ― SEQTA Learn' const element = document.querySelector('[data-key=home]') + await new Promise((resolve) => { + // Delay to prevent SEQTA from removing the UI elements + setTimeout(resolve, 8) + }) + // Apply the active class to indicate clicked on home button element!.classList.add('active') @@ -2201,34 +2205,33 @@ async function loadHomePage() { return } - main.innerHTML = ''; - const icon = document.querySelector('link[rel*="icon"]')! as HTMLLinkElement icon.href = icon48 currentSelectedDate = new Date() // Creates the root of the home page added to the main div - var html = stringToHTML('
    ') + let homeContainer = stringToHTML('
    ') + console.log(homeContainer?.firstChild!) // Appends the html file to main div // Note: firstChild of html is done due to needing to grab the body from the stringToHTML function - main!.append(html.firstChild!) + main.append(homeContainer?.firstChild!) // Gets the current date const date = new Date() - - + console.log(document.getElementById('main')) + // Creates the shortcut container into the home container const Shortcut = stringToHTML('
    ') // Appends the shortcut container into the home container - document.getElementById('home-container')!.append(Shortcut.firstChild!) + document.getElementById('home-container')?.append(Shortcut?.firstChild!) // Creates the container div for the timetable portion of the home page const Timetable = stringToHTML('

    Today\'s Lessons

    ') // Appends the timetable container into the home container - document.getElementById('home-container')!.append(Timetable.firstChild!) + document.getElementById('home-container')?.append(Timetable?.firstChild!) // Formats the current date used send a request for timetable and notices later const TodayFormatted = From 3dad8deed9fc1a37b9efe9bc8b509dd250bfd923 Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Fri, 26 Jan 2024 09:10:16 +1100 Subject: [PATCH 37/46] remove console logs --- src/SEQTA.ts | 25 ------------------------- 1 file changed, 25 deletions(-) diff --git a/src/SEQTA.ts b/src/SEQTA.ts index 4b6d59dd..1692bdf6 100644 --- a/src/SEQTA.ts +++ b/src/SEQTA.ts @@ -30,10 +30,6 @@ import stringToHTML from './seqta/utils/stringToHTML' import { updateAllColors } from './seqta/ui/colors/Manager' import { updateBgDurations } from './seqta/ui/Animation' -/* import injected from 'url:./css/injected.scss'; - */ /* import documentLoad from 'url:./css/documentload.scss'; */ - - declare global { interface Window { chrome?: any @@ -66,19 +62,6 @@ document.addEventListener( import('./css/injected.scss') import('./css/documentload.scss') - /* const injectedCSS = document.createElement('link') - injectedCSS.setAttribute('rel', 'stylesheet') - injectedCSS.setAttribute('type', 'text/css') - injectedCSS.setAttribute('href', injected) */ - - /* const documentLoadCSS = document.createElement('link') - documentLoadCSS.setAttribute('rel', 'stylesheet') - documentLoadCSS.setAttribute('type', 'text/css') - documentLoadCSS.setAttribute('href', documentLoad) */ - - /* document.head.appendChild(documentLoadCSS) */ - /* document.head.appendChild(injectedCSS) */ - enableCurrentTheme() try { const items = await browser.storage.local.get() as SettingsState @@ -385,14 +368,12 @@ export function waitForElm(selector: string) { } }); - // 🛡️ Safety check: Ensure document.body is available if (document.body) { observer.observe(document.body, { childList: true, subtree: true, }); } else { - // 🚨 Fallback: Wait for the document to be ready document.addEventListener('DOMContentLoaded', () => { observer.observe(document.body, { childList: true, @@ -1578,8 +1559,6 @@ function CheckUnmarkedAttendance(lessonattendance: any) { } function callHomeTimetable(date: string, change?: any) { - const DayContainer = document.getElementById('day-container')! - console.log("Daycontainer: ", DayContainer) // Creates a HTTP Post Request to the SEQTA page for the students timetable var xhr = new XMLHttpRequest() xhr.open('POST', `${location.origin}/seqta/student/load/timetable?`, true) @@ -1654,7 +1633,6 @@ function callHomeTimetable(date: string, change?: any) { }) } } else { - console.log(DayContainer); DayContainer.innerHTML = '' var dummyDay = document.createElement('div') dummyDay.classList.add('day-empty') @@ -2213,7 +2191,6 @@ async function loadHomePage() { // Creates the root of the home page added to the main div let homeContainer = stringToHTML('
    ') - console.log(homeContainer?.firstChild!) // Appends the html file to main div // Note: firstChild of html is done due to needing to grab the body from the stringToHTML function main.append(homeContainer?.firstChild!) @@ -2221,8 +2198,6 @@ async function loadHomePage() { // Gets the current date const date = new Date() - console.log(document.getElementById('main')) - // Creates the shortcut container into the home container const Shortcut = stringToHTML('
    ') // Appends the shortcut container into the home container From 07a9ddadf74688ff92920ba516645726a1d2640f Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Fri, 26 Jan 2024 09:11:00 +1100 Subject: [PATCH 38/46] uncomment animations --- src/SEQTA.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/SEQTA.ts b/src/SEQTA.ts index 1692bdf6..f977aaf3 100644 --- a/src/SEQTA.ts +++ b/src/SEQTA.ts @@ -1,6 +1,6 @@ import * as Sentry from "@sentry/browser" -import { animate, spring, /* stagger */ } from 'motion' +import { animate, spring, stagger } from 'motion' import loading, { AppendLoadingSymbol } from './seqta/ui/Loading' import updateVideo from 'url:./resources/update-video.mp4' @@ -259,7 +259,7 @@ function OpenWhatsNewPopup() { { easing: spring({ stiffness: 220, damping: 18 }) } ) - /* animate( + animate( '.whatsnewTextContainer *', { opacity: [0, 1], y: [10, 0] }, { @@ -267,7 +267,7 @@ function OpenWhatsNewPopup() { duration: 0.5, easing: [.22, .03, .26, 1] } - ) */ + ) browser.storage.local.remove(['justupdated']) @@ -2320,7 +2320,7 @@ async function loadHomePage() { // Appends the shortcut container into the home container document.getElementById('home-container')!.append(Notices.firstChild!) - /* animate( + animate( '.home-container > div', { opacity: [0, 1], y: [10, 0] }, { @@ -2328,7 +2328,7 @@ async function loadHomePage() { duration: 0.6, easing: [.22, .03, .26, 1] } - ) */ + ) callHomeTimetable(TodayFormatted) From 06621e29808804884c06e290612207b947a026ac Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Fri, 26 Jan 2024 11:43:21 +1100 Subject: [PATCH 39/46] fix: add willchange to loading spinner --- src/seqta/ui/Loading.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/seqta/ui/Loading.ts b/src/seqta/ui/Loading.ts index a0c93768..528a6b4b 100644 --- a/src/seqta/ui/Loading.ts +++ b/src/seqta/ui/Loading.ts @@ -54,18 +54,21 @@ export default function loading() { } .big-circle { margin: -88px; + will-change: transform; animation-timing-function: ease; animation: spin 3s linear infinite; -moz-animation: spin 3s linear infinite; } .small-circle { margin: -66px; + will-change: transform; animation-timing-function: ease; animation: spin 3s linear infinite; -moz-animation: spin 3s linear infinite; } .outer-circle { margin: -108px; + will-change: transform; animation-direction: alternate-reverse; animation: spinback 1s linear infinite; -moz-animation: spinback 1s linear infinite; From 6f129edcc58b1096e7a668d3a5102f68ba5507bd Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Fri, 26 Jan 2024 12:10:51 +1100 Subject: [PATCH 40/46] fix font inside interface --- src/interface/main.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/interface/main.tsx b/src/interface/main.tsx index 4d069335..51326b7b 100644 --- a/src/interface/main.tsx +++ b/src/interface/main.tsx @@ -5,7 +5,10 @@ import './index.css'; import { SettingsContextProvider } from './SettingsContext.js'; import SettingsPage from './SettingsPage.js'; import browser from 'webextension-polyfill'; +import font from 'url:../resources/fonts/IconFamily.woff' + import * as Sentry from "@sentry/react"; + browser.storage.local.get([ "telemetry" ]).then((telemetry) => { if (telemetry.telemetry === true) Sentry.init({ @@ -24,14 +27,13 @@ browser.storage.local.get([ "telemetry" ]).then((telemetry) => { replaysOnErrorSampleRate: 1.0, // If you're not already sampling the entire session, change the sample rate to 100% when sampling sessions where errors occur. }); }) -const fontURL = browser.runtime.getURL("fonts/IconFamily.woff"); const style = document.createElement("style"); style.setAttribute("type", "text/css"); style.innerHTML = ` @font-face { font-family: 'IconFamily'; - src: url('${fontURL}') format('woff'); + src: url('${font}') format('woff'); font-weight: normal; font-style: normal; }`; From 8b3ed57046bdf2ec4c2b05026f06632b49c61e97 Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Fri, 26 Jan 2024 12:19:09 +1100 Subject: [PATCH 41/46] fix: disable hmr (as it only partially works, and breaks other things) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1ca7e66d..60e9670c 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "type": "module", "description": "BetterSEQTA+ is a browser extension that adds features to SEQTA.", "scripts": { - "dev": "parcel watch manifest.json --host localhost --config @parcel/config-webextension", + "dev": "parcel watch manifest.json --host localhost --config @parcel/config-webextension --no-hmr --no-content-hash", "build": "parcel build manifest.json --config @parcel/config-webextension --no-content-hash", "eslint": "eslint --fix ." }, From 424dc26f8761e0bf56b82e5a473601198b1a67ad Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Fri, 26 Jan 2024 12:23:04 +1100 Subject: [PATCH 42/46] update readme --- README.md | 52 +++++++++++++++++++++------------------------------- package.json | 3 ++- 2 files changed, 23 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index 7094043a..52a481ae 100644 --- a/README.md +++ b/README.md @@ -47,59 +47,49 @@ git clone https://github.com/SethBurkart123/EvenBetterSEQTA ``` -### Windows +### Running Development -Open the `install.bat` file located inside the `scripts` folder. Then after that is finished, open the `dev.bat` file. - -### Mac & Linux +1. Install dependencies -1. `cd` into the seqta folder -``` -cd EvenBetterSEQTA/scripts -``` -2. Make the scripts in the folder executable -``` -chmod a+x * ``` -3. Run the install and dev scripts +npm install # or your preferred package manager like pnpm or yarn ``` -sh install.sh -``` -4. Open a new terminal session to let the new command activate, then run + +2. Run the dev script (it updates as you save files) + ``` -sh dev.sh +npm run dev ``` -### Manual +3. Load the extension into chrome -1. Install dependencies +- Go to `chrome://extensions` +- Enable developer mode +- Click `Load unpacked` +- Select the `dist` folder -``` -npm install -``` +Just remember, in order to update changes to the extension, you need to click the refresh button on the extension in `chrome://extensions` whenever anything's changed. -2. Install webpack +### Building for production + +1. Install dependencies ``` -npm install -g webpack +npm install # or your preferred package manager like pnpm or yarn ``` -3. Run the dev script (it updates as you save files) +2. Run the build script ``` -npm run dev +npm run build ``` -4. Install and run the dev script for the interface **at the same time** (all custom react components are a separate sub-repository) +3. Package it up (optional) ``` -cd interface - -npm install -npm run dev +npm run package # this requires 7zip to be installed in order to work ``` - ## Folder Structure The folder structure is as follows: diff --git a/package.json b/package.json index 60e9670c..e74917ed 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,8 @@ "scripts": { "dev": "parcel watch manifest.json --host localhost --config @parcel/config-webextension --no-hmr --no-content-hash", "build": "parcel build manifest.json --config @parcel/config-webextension --no-content-hash", - "eslint": "eslint --fix ." + "eslint": "eslint --fix .", + "package": "7z a -tzip extension.zip ./build/*" }, "keywords": [], "author": "", From 7ca619b75bb76fa227a9ccaf72b2c721bd4f3c56 Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Fri, 26 Jan 2024 12:36:23 +1100 Subject: [PATCH 43/46] added dev and build scripts for firefox --- chrome/manifest.json | 42 -------------------------------------- package.json | 6 +++++- public/interface/popup.css | 14 ------------- 3 files changed, 5 insertions(+), 57 deletions(-) delete mode 100644 chrome/manifest.json delete mode 100644 public/interface/popup.css diff --git a/chrome/manifest.json b/chrome/manifest.json deleted file mode 100644 index 530f15e2..00000000 --- a/chrome/manifest.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "manifest_version": 3, - "name": "BetterSEQTA+", - "version": "3.2.2", - "description": "Make SEQTA usable and beautiful! A fork of BetterSEQTA to continue development and add WAY more features!!!", - "icons": { - "32": "src/resources/icons/icon-32.png", - "48": "src/resources/icons/icon-48.png", - "64": "src/resources/icons/icon-64.png" - }, - "action": { - "browser_style": true, - "default_popup": "src/interface/index.html#settings", - "default_icon": { - "32": "src/resources/icons/icon-32.png", - "48": "src/resources/icons/icon-48.png", - "64": "src/resources/icons/icon-64.png" - } - }, - "permissions": ["tabs", "notifications", "storage"], - "host_permissions": ["https://newsapi.org/", "*://*/*"], - "background": { - "service_worker": "src/background.ts", - "type": "module" - }, - "content_scripts": [ - { - "matches": ["*://*/*"], - "js": ["src/SEQTA.ts"], - "run_at": "document_start" - } - ], - "web_accessible_resources": [ - { - "resources": [ - "public/*", - "src/*" - ], - "matches": ["*://*/*"] - } - ] -} \ No newline at end of file diff --git a/package.json b/package.json index e74917ed..5c329d4b 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,11 @@ "description": "BetterSEQTA+ is a browser extension that adds features to SEQTA.", "scripts": { "dev": "parcel watch manifest.json --host localhost --config @parcel/config-webextension --no-hmr --no-content-hash", - "build": "parcel build manifest.json --config @parcel/config-webextension --no-content-hash", + "build": "parcel build manifest.json --config @parcel/config-webextension --no-content-hash --no-cache", + + "dev-firefox": "parcel watch firefox/manifest.json --host localhost --config @parcel/config-webextension --no-hmr --no-content-hash", + "build-firefox": "parcel build firefox/manifest.json --config @parcel/config-webextension --no-content-hash --no-cache", + "eslint": "eslint --fix .", "package": "7z a -tzip extension.zip ./build/*" }, diff --git a/public/interface/popup.css b/public/interface/popup.css deleted file mode 100644 index aaa72a99..00000000 --- a/public/interface/popup.css +++ /dev/null @@ -1,14 +0,0 @@ -.hide { - opacity: 0; - pointer-events: none; -} - -.outside-container { - margin: 0; - overflow: hidden; - position: absolute; - right: 10px; - top: 80px; - height: 590px; - z-index: 20; -} From f13db84470d46ce0276202d6bfc3ec3141e9208e Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Fri, 26 Jan 2024 12:49:55 +1100 Subject: [PATCH 44/46] update github workflows to use the updated system --- .github/workflows/{webpack.yml => testing.yml} | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) rename .github/workflows/{webpack.yml => testing.yml} (70%) diff --git a/.github/workflows/webpack.yml b/.github/workflows/testing.yml similarity index 70% rename from .github/workflows/webpack.yml rename to .github/workflows/testing.yml index 5fd47057..848650c8 100644 --- a/.github/workflows/webpack.yml +++ b/.github/workflows/testing.yml @@ -1,4 +1,4 @@ -name: NodeJS with Webpack +name: NodeJS Testing on: push: @@ -12,7 +12,7 @@ jobs: strategy: matrix: - node-version: [14.x, 16.x, 18.x] + node-version: [20.x] steps: - uses: actions/checkout@v3 @@ -24,9 +24,5 @@ jobs: - name: Build run: | - cd interface npm install - npm run build - cd .. - npm install - npm run build + npm run build \ No newline at end of file From 09b95e51d7c46fa49c58b6ae22ac57857bd99e69 Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Fri, 26 Jan 2024 12:51:07 +1100 Subject: [PATCH 45/46] fix: add @parcel/transformer-sass --- package.json | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/package.json b/package.json index 5c329d4b..63ebf47c 100644 --- a/package.json +++ b/package.json @@ -6,10 +6,8 @@ "scripts": { "dev": "parcel watch manifest.json --host localhost --config @parcel/config-webextension --no-hmr --no-content-hash", "build": "parcel build manifest.json --config @parcel/config-webextension --no-content-hash --no-cache", - "dev-firefox": "parcel watch firefox/manifest.json --host localhost --config @parcel/config-webextension --no-hmr --no-content-hash", "build-firefox": "parcel build firefox/manifest.json --config @parcel/config-webextension --no-content-hash --no-cache", - "eslint": "eslint --fix .", "package": "7z a -tzip extension.zip ./build/*" }, @@ -20,7 +18,7 @@ "@parcel/config-webextension": "^2.10.3", "@parcel/optimizer-data-url": "^2.11.0", "@parcel/transformer-inline-string": "^2.11.0", - "@parcel/transformer-sass": "2.10.3", + "@parcel/transformer-sass": "^2.11.0", "assert": "^2.0.0", "browserify-zlib": "^0.2.0", "crypto-browserify": "^3.12.0", From 9ba60cb99794d34153ce9fe78cd10e50e48aef6a Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Fri, 26 Jan 2024 14:24:03 +1100 Subject: [PATCH 46/46] fix: iframe theming --- package.json | 4 +- src/SEQTA.ts | 20 ++--- src/css/iframe.scss | 144 ++++++++++++++++++--------------- src/css/iframe.ts | 1 - src/seqta/ui/colors/Manager.ts | 12 ++- 5 files changed, 92 insertions(+), 89 deletions(-) delete mode 100644 src/css/iframe.ts diff --git a/package.json b/package.json index 63ebf47c..b87c8560 100644 --- a/package.json +++ b/package.json @@ -15,10 +15,10 @@ "author": "", "license": "MIT", "devDependencies": { - "@parcel/config-webextension": "^2.10.3", + "@parcel/config-webextension": "^2.11.0", "@parcel/optimizer-data-url": "^2.11.0", "@parcel/transformer-inline-string": "^2.11.0", - "@parcel/transformer-sass": "^2.11.0", + "@parcel/transformer-sass": "2.11.0", "assert": "^2.0.0", "browserify-zlib": "^0.2.0", "crypto-browserify": "^3.12.0", diff --git a/src/SEQTA.ts b/src/SEQTA.ts index f977aaf3..d0216462 100644 --- a/src/SEQTA.ts +++ b/src/SEQTA.ts @@ -24,10 +24,10 @@ import browser from 'webextension-polyfill' import coursesicon from './seqta/icons/coursesIcon' import { delay } from "./seqta/utils/delay" import { enableCurrentTheme } from './seqta/ui/Themes' -import iframeCSS from "url:./css/iframe.scss" +import iframeCSS from "bundle-text:./css/iframe.scss" import { onError } from './seqta/utils/onError' import stringToHTML from './seqta/utils/stringToHTML' -import { updateAllColors } from './seqta/ui/colors/Manager' +import { getDarkMode, updateAllColors } from './seqta/ui/colors/Manager' import { updateBgDurations } from './seqta/ui/Animation' declare global { @@ -413,6 +413,7 @@ function removeThemeTagsFromNotices () { async function updateIframesWithDarkMode(): Promise { // Load the CSS file to overwrite iFrame default CSS const cssLink = document.createElement('style') + cssLink.classList.add('iframecss') const cssContent = document.createTextNode(iframeCSS) cssLink.appendChild(cssContent) @@ -423,16 +424,14 @@ async function updateIframesWithDarkMode(): Promise { const iframe = node as HTMLIFrameElement try { const settings = await browser.storage.local.get('DarkMode') as SettingsState - if (settings.DarkMode) { - applyDarkModeToIframe(iframe, cssLink) - } + applyDarkModeToIframe(iframe, cssLink, settings.DarkMode); } catch (error) { console.error('Error applying dark mode:', error) } } } } - }) + }); if (document.body) { observer.observe(document.body, { @@ -449,17 +448,14 @@ async function updateIframesWithDarkMode(): Promise { } } -function applyDarkModeToIframe(iframe: HTMLIFrameElement, cssLink: HTMLStyleElement): void { +function applyDarkModeToIframe(iframe: HTMLIFrameElement, cssLink: HTMLStyleElement, DarkMode: boolean): void { const iframeDocument = iframe.contentDocument if (!iframeDocument) return - const body = iframeDocument.body - if (body && body.style.color !== 'white') { - body.style.color = 'white' - } + if (DarkMode) iframeDocument.body.classList.add('dark') const head = iframeDocument.head - if (head && !head.innerHTML.includes('iframe.css')) { + if (head && !head.innerHTML.includes('iframecss')) { head.appendChild(cssLink) } } diff --git a/src/css/iframe.scss b/src/css/iframe.scss index 4069541d..5b5ef625 100644 --- a/src/css/iframe.scss +++ b/src/css/iframe.scss @@ -15,89 +15,99 @@ * along with EvenBetterSEQTA. If not, see . */ -html, p, div, span { - color: white !important; - text-shadow: 1px 1px 2px #161616, 0 0 1em #161616; + body { + background: transparent; } -body { - background-color: transparent !important; -} +.dark { + p, + div, + span { + color: white !important; + text-shadow: 1px 1px 2px #161616, 0 0 1em #161616; + } -blockquote.forward > .preamble { - color: rgba(255, 255, 255, 0.7) !important; - - > .date > .value, blockquote.forward > .preamble > .sender > .value { - color: rgba(255, 255, 255, 0.7) !important; + body { + background-color: transparent !important; } - - > .date > .label, blockquote.forward > .preamble > .sender > .label { + + blockquote.forward > .preamble { color: rgba(255, 255, 255, 0.7) !important; + + > p, + div, + span { + background: transparent !important; + } + + > .date > .value, + blockquote.forward > .preamble > .sender > .value { + color: rgba(255, 255, 255, 0.7) !important; + } + + > .date > .label, + blockquote.forward > .preamble > .sender > .label { + color: rgba(255, 255, 255, 0.7) !important; + } } -} -[bgcolor="#ffffff"] { - color: black; -} + [bgcolor="#ffffff"] > * { + color: black !important; + text-shadow: none !important; + } -table th { - background-color: #161616; -} + table th { + background-color: #161616; + } -::-webkit-scrollbar { - width: 10px; - height: 10px; - transition: 1s; -} + ::-webkit-scrollbar { + width: 10px; + height: 10px; + transition: 1s; + } -::-webkit-scrollbar-track { - background-color: transparent; -} + ::-webkit-scrollbar-track { + background-color: transparent; + } -::-webkit-scrollbar-thumb { - border-radius: 10rem !important; -} + ::-webkit-scrollbar-thumb { + border-radius: 10rem !important; + } -::-webkit-scrollbar-corner { - background: none; -} + ::-webkit-scrollbar-corner { + background: none; + } -.forward { - border-radius: 1rem; -} + .forward { + border-radius: 1rem; + } -.preamble { - border-top-left-radius: 1rem; - border-top-right-radius: 1rem; -} + .preamble { + border-top-left-radius: 1rem; + border-top-right-radius: 1rem; + } -html, p, div, span { - color: white !important; - background-color: #232323 -} -body { - background-color: #232323; -} -blockquote.forward > .preamble { - color: rgba(255, 255, 255, 0.7) !important; -} + blockquote.forward > .preamble { + color: rgba(255, 255, 255, 0.7) !important; + } -blockquote.forward > .preamble > .date > .value, -blockquote.forward > .preamble > .sender > .value { - color: rgba(255, 255, 255, 0.7) !important; -} -blockquote.forward > .preamble > .date > .label, -blockquote.forward > .preamble > .sender > .label { - color: rgba(255, 255, 255, 0.7) !important; -} + blockquote.forward > .preamble > .date > .value, + blockquote.forward > .preamble > .sender > .value { + color: rgba(255, 255, 255, 0.7) !important; + } + blockquote.forward > .preamble > .date > .label, + blockquote.forward > .preamble > .sender > .label { + color: rgba(255, 255, 255, 0.7) !important; + } -#backgroundTable > * { - background-color: #161616; - border: none; -} + #backgroundTable > * { + background-color: #161616; + border: none; + } -.userHTML>div>a:not(.resource) { - color: #06b4fc; - text-decoration: underline; - transition: text-shadow 0.5s; + .userHTML > div > a:not(.resource) { + color: #06b4fc; + text-decoration: underline; + transition: text-shadow 0.5s; + } } \ No newline at end of file diff --git a/src/css/iframe.ts b/src/css/iframe.ts deleted file mode 100644 index cc616640..00000000 --- a/src/css/iframe.ts +++ /dev/null @@ -1 +0,0 @@ -import './iframe.scss'; diff --git a/src/seqta/ui/colors/Manager.ts b/src/seqta/ui/colors/Manager.ts index 73f8f020..a8c68782 100644 --- a/src/seqta/ui/colors/Manager.ts +++ b/src/seqta/ui/colors/Manager.ts @@ -6,7 +6,6 @@ import { SettingsState } from '../../../types/storage'; import darkLogo from 'url:../../../resources/icons/betterseqta-light-full.png'; import lightLogo from 'url:../../../resources/icons/betterseqta-dark-full.png'; -import iFrameCSS from 'url:../../../css/iframe.scss'; // Helper functions const setCSSVar = (varName: any, value: any) => document.documentElement.style.setProperty(varName, value); @@ -71,7 +70,6 @@ export function updateAllColors(storedSetting: any, newColor = null) { } let alliframes = document.getElementsByTagName('iframe'); - let fileref = iFrameCSS; for (let i = 0; i < alliframes.length; i++) { const element = alliframes[i]; @@ -80,11 +78,11 @@ export function updateAllColors(storedSetting: any, newColor = null) { continue; } - (element.contentDocument!.documentElement.childNodes[1] as HTMLIFrameElement).style.color = - DarkMode ? 'white' : 'black'; - element.contentDocument!.documentElement.firstChild!.appendChild( - fileref, - ); + if (DarkMode) { + element.contentDocument?.body.classList.add('dark'); + } else { + element.contentDocument?.body.classList.remove('dark'); + } } }