From 1bc0221e80110fb8041765a929090e07173e2ad2 Mon Sep 17 00:00:00 2001 From: ayoung19 Date: Wed, 19 Jul 2023 02:12:15 -0700 Subject: [PATCH 01/23] Add options page configs --- manifest.json | 1 + package-lock.json | 2088 ++++++++++++++++- package.json | 13 + src/pages/options/App.tsx | 86 + src/pages/options/index.html | 13 + src/pages/options/index.tsx | 13 + .../options/settings/InventorySettings.tsx | 32 + src/pages/options/settings/MarketSettings.tsx | 34 + src/pages/options/settings/SettingsPage.tsx | 27 + src/pages/wow/index.html | 13 + src/pages/wow/index.tsx | 9 + tsconfig.json | 3 +- webpack.config.js | 24 +- 13 files changed, 2304 insertions(+), 52 deletions(-) create mode 100644 src/pages/options/App.tsx create mode 100644 src/pages/options/index.html create mode 100644 src/pages/options/index.tsx create mode 100644 src/pages/options/settings/InventorySettings.tsx create mode 100644 src/pages/options/settings/MarketSettings.tsx create mode 100644 src/pages/options/settings/SettingsPage.tsx create mode 100644 src/pages/wow/index.html create mode 100644 src/pages/wow/index.tsx diff --git a/manifest.json b/manifest.json index 6828f06b..62ed5a40 100644 --- a/manifest.json +++ b/manifest.json @@ -9,6 +9,7 @@ "48": "icons/48.png", "128": "icons/128.png" }, + "options_page": "src/pages/options/index.html", "content_scripts": [ { "matches": ["*://*.steamcommunity.com/market/listings/730/*"], diff --git a/package-lock.json b/package-lock.json index 689c1704..e5bfc80e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,10 +8,20 @@ "name": "csgofloat-extension", "version": "3.1.0", "license": "MIT", + "dependencies": { + "@emotion/react": "^11.11.1", + "@mantine/core": "^6.0.17", + "@mantine/hooks": "^6.0.17", + "@tabler/icons-react": "^2.26.0", + "react": "^18.2.0", + "react-dom": "^18.2.0" + }, "devDependencies": { "@types/chrome": "^0.0.193", "@types/jquery": "^3.5.14", "@types/lodash": "^4.14.195", + "@types/react": "^18.2.15", + "@types/react-dom": "^18.2.7", "@typescript-eslint/eslint-plugin": "^5.39.0", "@typescript-eslint/parser": "^5.39.0", "copy-webpack-plugin": "^11.0.0", @@ -23,8 +33,10 @@ "fast-json-stable-stringify": "^2.1.0", "file-loader": "^6.2.0", "filtrex": "^3.0.0", + "fs": "^0.0.1-security", "glob": "^8.0.3", "html-loader": "^4.1.0", + "html-webpack-plugin": "^5.5.3", "ignore-loader": "^0.1.2", "lit": "^2.3.0", "lit-html": "^2.3.1", @@ -32,6 +44,7 @@ "lodash-decorators": "^6.0.1", "mini-css-extract-plugin": "^2.6.1", "prettier": "^2.7.1", + "process": "^0.11.10", "rxjs": "^7.5.7", "sass-loader": "^13.0.2", "ts-loader": "^9.3.1", @@ -40,6 +53,145 @@ "webpack-cli": "^4.10.0" } }, + "node_modules/@babel/code-frame": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "dependencies": { + "@babel/highlight": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/runtime": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", @@ -49,6 +201,117 @@ "node": ">=10.0.0" } }, + "node_modules/@emotion/babel-plugin": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", + "dependencies": { + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "node_modules/@emotion/react": { + "version": "11.11.1", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz", + "integrity": "sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz", + "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==", + "dependencies": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" + }, + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + }, "node_modules/@eslint/eslintrc": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.2.tgz", @@ -94,6 +357,45 @@ "node": "*" } }, + "node_modules/@floating-ui/core": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.3.1.tgz", + "integrity": "sha512-Bu+AMaXNjrpjh41znzHqaz3r2Nr8hHuHZT6V2LBKMhyMl0FgKA62PNYbqnfgmzOhoWZj70Zecisbo4H1rotP5g==" + }, + "node_modules/@floating-ui/dom": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.4.5.tgz", + "integrity": "sha512-96KnRWkRnuBSSFbj0sFGwwOUd8EkiecINVl0O9wiZlZ64EkpyAOG3Xc2vKKNJmru0Z7RqWNymA+6b8OZqjgyyw==", + "dependencies": { + "@floating-ui/core": "^1.3.1" + } + }, + "node_modules/@floating-ui/react": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.19.2.tgz", + "integrity": "sha512-JyNk4A0Ezirq8FlXECvRtQOX/iBe5Ize0W/pLkrZjfHW9GUV7Xnq6zm6fyZuQzaHHqEnVizmvlA96e1/CkZv+w==", + "dependencies": { + "@floating-ui/react-dom": "^1.3.0", + "aria-hidden": "^1.1.3", + "tabbable": "^6.0.1" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-1.3.0.tgz", + "integrity": "sha512-htwHm67Ji5E/pROEAr7f8IKFShuiCKHwUC/UY4vC3I5jiSvGFAYnSYiZO5MlGmads+QqvUkR9ANHEguGrDv72g==", + "dependencies": { + "@floating-ui/dom": "^1.2.1" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.10.7", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.7.tgz", @@ -210,6 +512,59 @@ "integrity": "sha512-blrtlLKvtVyjTJ3gUHWNSHOU6tD8be9mRafqtnO7GVMcB+5z4RjNcO0DpMGmccK6N8yur1vVVYnS0gPdQ/WgEQ==", "dev": true }, + "node_modules/@mantine/core": { + "version": "6.0.17", + "resolved": "https://registry.npmjs.org/@mantine/core/-/core-6.0.17.tgz", + "integrity": "sha512-g3EDxcTJKisvEGTsGJPCGXiDumwr4O0nGNXwoGLnrg19nh3FAMfEIq18sJJLtRrBuarSbrvgMVYvKx1R6rTOWg==", + "dependencies": { + "@floating-ui/react": "^0.19.1", + "@mantine/styles": "6.0.17", + "@mantine/utils": "6.0.17", + "@radix-ui/react-scroll-area": "1.0.2", + "react-remove-scroll": "^2.5.5", + "react-textarea-autosize": "8.3.4" + }, + "peerDependencies": { + "@mantine/hooks": "6.0.17", + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@mantine/hooks": { + "version": "6.0.17", + "resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-6.0.17.tgz", + "integrity": "sha512-7vf2w1NlzKlUynSuyI2DAIKoEOYKYC8k+tlSsk3BRdbzhbJAiWxcYzJy5seg5dFW1WIpKAZ0wiVdHXf/WRlRgg==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@mantine/styles": { + "version": "6.0.17", + "resolved": "https://registry.npmjs.org/@mantine/styles/-/styles-6.0.17.tgz", + "integrity": "sha512-utNwQJgKHguNS0iPyyeFRJy4nbt280XMbmfUf4GCxXlyl/mQxq+JoaKP/OmU7+8kfbtLS9kHeuBSghrC65Nt1g==", + "dependencies": { + "clsx": "1.1.1", + "csstype": "3.0.9" + }, + "peerDependencies": { + "@emotion/react": ">=11.9.0", + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@mantine/styles/node_modules/csstype": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.9.tgz", + "integrity": "sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==" + }, + "node_modules/@mantine/utils": { + "version": "6.0.17", + "resolved": "https://registry.npmjs.org/@mantine/utils/-/utils-6.0.17.tgz", + "integrity": "sha512-U6SWV/asYE6NhiHx4ltmVZdQR3HwGVqJxVulhOylMcV1tX/P1LMQUCbGV2Oe4O9jbX4/YW5B/CBb4BbEhENQFQ==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -245,6 +600,162 @@ "node": ">= 8" } }, + "node_modules/@radix-ui/number": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.0.0.tgz", + "integrity": "sha512-Ofwh/1HX69ZfJRiRBMTy7rgjAzHmwe4kW9C9Y99HTRUcYLUuVT0KESFj15rPjRgKJs20GPq8Bm5aEDJ8DuA3vA==", + "dependencies": { + "@babel/runtime": "^7.13.10" + } + }, + "node_modules/@radix-ui/primitive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.0.tgz", + "integrity": "sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==", + "dependencies": { + "@babel/runtime": "^7.13.10" + } + }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz", + "integrity": "sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-context": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.0.tgz", + "integrity": "sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-direction": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.0.0.tgz", + "integrity": "sha512-2HV05lGUgYcA6xgLQ4BKPDmtL+QbIZYH5fCOTAOOcJ5O0QbWS3i9lKaurLzliYUDhORI2Qr3pyjhJh44lKA3rQ==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-presence": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.0.tgz", + "integrity": "sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-use-layout-effect": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.1.tgz", + "integrity": "sha512-fHbmislWVkZaIdeF6GZxF0A/NH/3BjrGIYj+Ae6eTmTCr7EB0RQAAVEiqsXK6p3/JcRqVSBQoceZroj30Jj3XA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-slot": "1.0.1" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-scroll-area": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.0.2.tgz", + "integrity": "sha512-k8VseTxI26kcKJaX0HPwkvlNBPTs56JRdYzcZ/vzrNUkDlvXBy8sMc7WvCpYzZkHgb+hd72VW9MqkqecGtuNgg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/number": "1.0.0", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-direction": "1.0.0", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-callback-ref": "1.0.0", + "@radix-ui/react-use-layout-effect": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.1.tgz", + "integrity": "sha512-avutXAFL1ehGvAXtPquu0YK5oz6ctS474iM3vNGQIkswrVhdrS52e3uoMQBzZhNRAIE0jBnUyXWNmSjGHhCFcw==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-use-callback-ref": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.0.tgz", + "integrity": "sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@radix-ui/react-use-layout-effect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.0.tgz", + "integrity": "sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "react": "^16.8 || ^17.0 || ^18.0" + } + }, + "node_modules/@tabler/icons": { + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-2.26.0.tgz", + "integrity": "sha512-fYUgqy2txHrFLxhO54lFbNCLdTIf0WtEwABdQ70fH/C6WvGDWpXSln7ntUwK1Z3MNtBkoyXUhtJgtue1yP8Gww==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/codecalm" + } + }, + "node_modules/@tabler/icons-react": { + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/@tabler/icons-react/-/icons-react-2.26.0.tgz", + "integrity": "sha512-IRhaSfCIRy2uMcUHQxJBSrQWh7KcTFFpGGqvYf+5YITWgr7HD2ipuBCR9d5MYx9o6DqM/B+9kKaUU63JA+dt0A==", + "dependencies": { + "@tabler/icons": "2.26.0", + "prop-types": "^15.7.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/codecalm" + }, + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/@types/chrome": { "version": "0.0.193", "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.193.tgz", @@ -302,6 +813,12 @@ "integrity": "sha512-OP6L9VuZNdskgNN3zFQQ54ceYD8OLq5IbqO4VK91ORLfOm7WdT/CiT/pHEBSQEqCInJ2y3O6iCm/zGtPElpgJQ==", "dev": true }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "dev": true + }, "node_modules/@types/jquery": { "version": "3.5.14", "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.14.tgz", @@ -329,6 +846,43 @@ "integrity": "sha512-6qKpDtoaYLM+5+AFChLhHermMQxc3TOEFIDzrZLPRGHPrLEwqFkkT5Kx3ju05g6X7uDPazz3jHbKPX0KzCjntg==", "dev": true }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "devOptional": true + }, + "node_modules/@types/react": { + "version": "18.2.15", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.15.tgz", + "integrity": "sha512-oEjE7TQt1fFTFSbf8kkNuc798ahTUzn3Le67/PWjE8MAfYAD/qB7O8hSTcromLFqHCt9bcdOg5GXMokzTjJ5SA==", + "devOptional": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz", + "integrity": "sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", + "devOptional": true + }, "node_modules/@types/sizzle": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", @@ -872,6 +1426,17 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "node_modules/aria-hidden": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz", + "integrity": "sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -881,6 +1446,20 @@ "node": ">=8" } }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -896,6 +1475,12 @@ "node": "*" } }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, "node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -955,7 +1540,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, "engines": { "node": ">=6" } @@ -1049,6 +1633,14 @@ "node": ">=6" } }, + "node_modules/clsx": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", + "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==", + "engines": { + "node": ">=6" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1085,6 +1677,11 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, "node_modules/copy-webpack-plugin": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", @@ -1162,6 +1759,21 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -1208,6 +1820,34 @@ "webpack": "^5.0.0" } }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -1220,6 +1860,11 @@ "node": ">=4" } }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1249,6 +1894,11 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -1273,6 +1923,79 @@ "node": ">=6.0.0" } }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, "node_modules/dot-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", @@ -1335,6 +2058,14 @@ "node": ">=4" } }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, "node_modules/es-module-lexer": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", @@ -1354,7 +2085,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, "engines": { "node": ">=10" }, @@ -1813,6 +2543,11 @@ "integrity": "sha512-7PUty9Bq+shxb6r1QVo0AmwJVY59HNN76YUD5TIkjtyG6nNhWPTe6dJVq4TKaGdl/V329ayG6rHK1sA31Hmz8Q==", "dev": true }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, "node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -1845,6 +2580,12 @@ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, + "node_modules/fs": { + "version": "0.0.1-security", + "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", + "integrity": "sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==", + "dev": true + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -1854,8 +2595,7 @@ "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "node_modules/functional-red-black-tree": { "version": "1.0.1", @@ -1863,6 +2603,14 @@ "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", "dev": true }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "engines": { + "node": ">=6" + } + }, "node_modules/glob": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", @@ -1950,7 +2698,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "dependencies": { "function-bind": "^1.1.1" }, @@ -1976,6 +2723,14 @@ "he": "bin/he" } }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, "node_modules/html-loader": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-4.1.0.tgz", @@ -2026,6 +2781,57 @@ "node": ">= 12" } }, + "node_modules/html-webpack-plugin": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.3.tgz", + "integrity": "sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg==", + "dev": true, + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "webpack": "^5.20.0" + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/icss-utils": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", @@ -2057,7 +2863,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -2073,7 +2878,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, "engines": { "node": ">=4" } @@ -2131,11 +2935,23 @@ "node": ">= 0.10" } }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, "node_modules/is-core-module": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", - "dev": true, "dependencies": { "has": "^1.0.3" }, @@ -2214,6 +3030,11 @@ "node": ">= 10.13.0" } }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -2229,8 +3050,7 @@ "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "node_modules/json-schema-traverse": { "version": "0.4.1", @@ -2287,6 +3107,11 @@ "node": ">= 0.8.0" } }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, "node_modules/lit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/lit/-/lit-2.3.0.tgz", @@ -2385,6 +3210,17 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, "node_modules/lower-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", @@ -2594,6 +3430,26 @@ "node": ">=0.10.0" } }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -2670,7 +3526,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, "dependencies": { "callsites": "^3.0.0" }, @@ -2678,6 +3533,23 @@ "node": ">=6" } }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/parse5": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz", @@ -2730,14 +3602,12 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, "engines": { "node": ">=8" } @@ -2898,6 +3768,35 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, "node_modules/punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -2936,6 +3835,117 @@ "safe-buffer": "^5.1.0" } }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/react-remove-scroll": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.6.tgz", + "integrity": "sha512-bO856ad1uDYLefgArk559IzUNeQ6SWH4QnrevIUjH+GczV56giDfl3h0Idptf2oIKxQmd1p9BN25jleKodTALg==", + "dependencies": { + "react-remove-scroll-bar": "^2.3.4", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz", + "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==", + "dependencies": { + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", + "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", + "dependencies": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-textarea-autosize": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.3.4.tgz", + "integrity": "sha512-CdtmP8Dc19xL8/R6sWvtknD/eCXkQr30dtvC4VmGInhRsfF8X/ihXCq6+9l9qbxmKRiq407/7z5fxE7cVWQNgQ==", + "dependencies": { + "@babel/runtime": "^7.10.2", + "use-composed-ref": "^1.3.0", + "use-latest": "^1.2.1" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/rechoir": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", @@ -2948,6 +3958,11 @@ "node": ">= 0.10" } }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, "node_modules/regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", @@ -2969,6 +3984,19 @@ "node": ">= 0.10" } }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "dev": true, + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -2982,7 +4010,6 @@ "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, "dependencies": { "is-core-module": "^2.9.0", "path-parse": "^1.0.7", @@ -3173,6 +4200,14 @@ } } }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, "node_modules/schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -3312,6 +4347,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, "node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -3331,7 +4371,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -3339,6 +4378,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==" + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -3406,6 +4450,14 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -3440,8 +4492,7 @@ "node_modules/tslib": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -3536,12 +4587,96 @@ "punycode": "^2.1.0" } }, + "node_modules/use-callback-ref": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz", + "integrity": "sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-composed-ref": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz", + "integrity": "sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/use-isomorphic-layout-effect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-latest": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz", + "integrity": "sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==", + "dependencies": { + "use-isomorphic-layout-effect": "^1.1.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", + "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "dev": true + }, "node_modules/v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", @@ -3728,6 +4863,14 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -3742,12 +4885,217 @@ } }, "dependencies": { + "@babel/code-frame": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "requires": { + "@babel/highlight": "^7.22.5" + } + }, + "@babel/helper-module-imports": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "requires": { + "@babel/types": "^7.22.5" + } + }, + "@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==" + }, + "@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==" + }, + "@babel/highlight": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "requires": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/runtime": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", + "requires": { + "regenerator-runtime": "^0.13.11" + } + }, + "@babel/types": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "requires": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + } + }, "@discoveryjs/json-ext": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true }, + "@emotion/babel-plugin": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", + "requires": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" + } + } + }, + "@emotion/cache": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", + "requires": { + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" + } + }, + "@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, + "@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "@emotion/react": { + "version": "11.11.1", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz", + "integrity": "sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==", + "requires": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "hoist-non-react-statics": "^3.3.1" + } + }, + "@emotion/serialize": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz", + "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==", + "requires": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + } + }, + "@emotion/sheet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" + }, + "@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "requires": {} + }, + "@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + }, + "@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + }, "@eslint/eslintrc": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.2.tgz", @@ -3786,6 +5134,37 @@ } } }, + "@floating-ui/core": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.3.1.tgz", + "integrity": "sha512-Bu+AMaXNjrpjh41znzHqaz3r2Nr8hHuHZT6V2LBKMhyMl0FgKA62PNYbqnfgmzOhoWZj70Zecisbo4H1rotP5g==" + }, + "@floating-ui/dom": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.4.5.tgz", + "integrity": "sha512-96KnRWkRnuBSSFbj0sFGwwOUd8EkiecINVl0O9wiZlZ64EkpyAOG3Xc2vKKNJmru0Z7RqWNymA+6b8OZqjgyyw==", + "requires": { + "@floating-ui/core": "^1.3.1" + } + }, + "@floating-ui/react": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.19.2.tgz", + "integrity": "sha512-JyNk4A0Ezirq8FlXECvRtQOX/iBe5Ize0W/pLkrZjfHW9GUV7Xnq6zm6fyZuQzaHHqEnVizmvlA96e1/CkZv+w==", + "requires": { + "@floating-ui/react-dom": "^1.3.0", + "aria-hidden": "^1.1.3", + "tabbable": "^6.0.1" + } + }, + "@floating-ui/react-dom": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-1.3.0.tgz", + "integrity": "sha512-htwHm67Ji5E/pROEAr7f8IKFShuiCKHwUC/UY4vC3I5jiSvGFAYnSYiZO5MlGmads+QqvUkR9ANHEguGrDv72g==", + "requires": { + "@floating-ui/dom": "^1.2.1" + } + }, "@humanwhocodes/config-array": { "version": "0.10.7", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.10.7.tgz", @@ -3875,15 +5254,56 @@ "integrity": "sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==", "dev": true, "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@lit/reactive-element": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.4.0.tgz", + "integrity": "sha512-blrtlLKvtVyjTJ3gUHWNSHOU6tD8be9mRafqtnO7GVMcB+5z4RjNcO0DpMGmccK6N8yur1vVVYnS0gPdQ/WgEQ==", + "dev": true + }, + "@mantine/core": { + "version": "6.0.17", + "resolved": "https://registry.npmjs.org/@mantine/core/-/core-6.0.17.tgz", + "integrity": "sha512-g3EDxcTJKisvEGTsGJPCGXiDumwr4O0nGNXwoGLnrg19nh3FAMfEIq18sJJLtRrBuarSbrvgMVYvKx1R6rTOWg==", + "requires": { + "@floating-ui/react": "^0.19.1", + "@mantine/styles": "6.0.17", + "@mantine/utils": "6.0.17", + "@radix-ui/react-scroll-area": "1.0.2", + "react-remove-scroll": "^2.5.5", + "react-textarea-autosize": "8.3.4" + } + }, + "@mantine/hooks": { + "version": "6.0.17", + "resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-6.0.17.tgz", + "integrity": "sha512-7vf2w1NlzKlUynSuyI2DAIKoEOYKYC8k+tlSsk3BRdbzhbJAiWxcYzJy5seg5dFW1WIpKAZ0wiVdHXf/WRlRgg==", + "requires": {} + }, + "@mantine/styles": { + "version": "6.0.17", + "resolved": "https://registry.npmjs.org/@mantine/styles/-/styles-6.0.17.tgz", + "integrity": "sha512-utNwQJgKHguNS0iPyyeFRJy4nbt280XMbmfUf4GCxXlyl/mQxq+JoaKP/OmU7+8kfbtLS9kHeuBSghrC65Nt1g==", + "requires": { + "clsx": "1.1.1", + "csstype": "3.0.9" + }, + "dependencies": { + "csstype": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.9.tgz", + "integrity": "sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==" + } } }, - "@lit/reactive-element": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.4.0.tgz", - "integrity": "sha512-blrtlLKvtVyjTJ3gUHWNSHOU6tD8be9mRafqtnO7GVMcB+5z4RjNcO0DpMGmccK6N8yur1vVVYnS0gPdQ/WgEQ==", - "dev": true + "@mantine/utils": { + "version": "6.0.17", + "resolved": "https://registry.npmjs.org/@mantine/utils/-/utils-6.0.17.tgz", + "integrity": "sha512-U6SWV/asYE6NhiHx4ltmVZdQR3HwGVqJxVulhOylMcV1tX/P1LMQUCbGV2Oe4O9jbX4/YW5B/CBb4BbEhENQFQ==", + "requires": {} }, "@nodelib/fs.scandir": { "version": "2.1.5", @@ -3911,6 +5331,121 @@ "fastq": "^1.6.0" } }, + "@radix-ui/number": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.0.0.tgz", + "integrity": "sha512-Ofwh/1HX69ZfJRiRBMTy7rgjAzHmwe4kW9C9Y99HTRUcYLUuVT0KESFj15rPjRgKJs20GPq8Bm5aEDJ8DuA3vA==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@radix-ui/primitive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.0.tgz", + "integrity": "sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@radix-ui/react-compose-refs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz", + "integrity": "sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@radix-ui/react-context": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.0.tgz", + "integrity": "sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@radix-ui/react-direction": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.0.0.tgz", + "integrity": "sha512-2HV05lGUgYcA6xgLQ4BKPDmtL+QbIZYH5fCOTAOOcJ5O0QbWS3i9lKaurLzliYUDhORI2Qr3pyjhJh44lKA3rQ==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@radix-ui/react-presence": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.0.tgz", + "integrity": "sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-use-layout-effect": "1.0.0" + } + }, + "@radix-ui/react-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.1.tgz", + "integrity": "sha512-fHbmislWVkZaIdeF6GZxF0A/NH/3BjrGIYj+Ae6eTmTCr7EB0RQAAVEiqsXK6p3/JcRqVSBQoceZroj30Jj3XA==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-slot": "1.0.1" + } + }, + "@radix-ui/react-scroll-area": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-scroll-area/-/react-scroll-area-1.0.2.tgz", + "integrity": "sha512-k8VseTxI26kcKJaX0HPwkvlNBPTs56JRdYzcZ/vzrNUkDlvXBy8sMc7WvCpYzZkHgb+hd72VW9MqkqecGtuNgg==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/number": "1.0.0", + "@radix-ui/primitive": "1.0.0", + "@radix-ui/react-compose-refs": "1.0.0", + "@radix-ui/react-context": "1.0.0", + "@radix-ui/react-direction": "1.0.0", + "@radix-ui/react-presence": "1.0.0", + "@radix-ui/react-primitive": "1.0.1", + "@radix-ui/react-use-callback-ref": "1.0.0", + "@radix-ui/react-use-layout-effect": "1.0.0" + } + }, + "@radix-ui/react-slot": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.1.tgz", + "integrity": "sha512-avutXAFL1ehGvAXtPquu0YK5oz6ctS474iM3vNGQIkswrVhdrS52e3uoMQBzZhNRAIE0jBnUyXWNmSjGHhCFcw==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.0" + } + }, + "@radix-ui/react-use-callback-ref": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.0.tgz", + "integrity": "sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@radix-ui/react-use-layout-effect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.0.tgz", + "integrity": "sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@tabler/icons": { + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-2.26.0.tgz", + "integrity": "sha512-fYUgqy2txHrFLxhO54lFbNCLdTIf0WtEwABdQ70fH/C6WvGDWpXSln7ntUwK1Z3MNtBkoyXUhtJgtue1yP8Gww==" + }, + "@tabler/icons-react": { + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/@tabler/icons-react/-/icons-react-2.26.0.tgz", + "integrity": "sha512-IRhaSfCIRy2uMcUHQxJBSrQWh7KcTFFpGGqvYf+5YITWgr7HD2ipuBCR9d5MYx9o6DqM/B+9kKaUU63JA+dt0A==", + "requires": { + "@tabler/icons": "2.26.0", + "prop-types": "^15.7.2" + } + }, "@types/chrome": { "version": "0.0.193", "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.193.tgz", @@ -3968,6 +5503,12 @@ "integrity": "sha512-OP6L9VuZNdskgNN3zFQQ54ceYD8OLq5IbqO4VK91ORLfOm7WdT/CiT/pHEBSQEqCInJ2y3O6iCm/zGtPElpgJQ==", "dev": true }, + "@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "dev": true + }, "@types/jquery": { "version": "3.5.14", "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.14.tgz", @@ -3995,6 +5536,43 @@ "integrity": "sha512-6qKpDtoaYLM+5+AFChLhHermMQxc3TOEFIDzrZLPRGHPrLEwqFkkT5Kx3ju05g6X7uDPazz3jHbKPX0KzCjntg==", "dev": true }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "devOptional": true + }, + "@types/react": { + "version": "18.2.15", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.15.tgz", + "integrity": "sha512-oEjE7TQt1fFTFSbf8kkNuc798ahTUzn3Le67/PWjE8MAfYAD/qB7O8hSTcromLFqHCt9bcdOg5GXMokzTjJ5SA==", + "devOptional": true, + "requires": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "@types/react-dom": { + "version": "18.2.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz", + "integrity": "sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", + "devOptional": true + }, "@types/sizzle": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", @@ -4394,12 +5972,30 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "aria-hidden": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz", + "integrity": "sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==", + "requires": { + "tslib": "^2.0.0" + } + }, "array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, + "babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "requires": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + } + }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -4412,6 +6008,12 @@ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, "brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -4451,8 +6053,7 @@ "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" }, "camel-case": { "version": "4.1.2", @@ -4517,6 +6118,11 @@ "shallow-clone": "^3.0.0" } }, + "clsx": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", + "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==" + }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -4550,6 +6156,11 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, "copy-webpack-plugin": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", @@ -4605,6 +6216,18 @@ } } }, + "cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -4638,12 +6261,36 @@ "semver": "^7.3.5" } }, + "css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true + }, "cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true }, + "csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -4665,6 +6312,11 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" + }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -4683,6 +6335,60 @@ "esutils": "^2.0.2" } }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dev": true, + "requires": { + "utila": "~0.4" + } + }, + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "dependencies": { + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + } + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, "dot-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", @@ -4727,6 +6433,14 @@ "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", "dev": true }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, "es-module-lexer": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", @@ -4742,8 +6456,7 @@ "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" }, "eslint": { "version": "8.22.0", @@ -5080,6 +6793,11 @@ "integrity": "sha512-7PUty9Bq+shxb6r1QVo0AmwJVY59HNN76YUD5TIkjtyG6nNhWPTe6dJVq4TKaGdl/V329ayG6rHK1sA31Hmz8Q==", "dev": true }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -5106,6 +6824,12 @@ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, + "fs": { + "version": "0.0.1-security", + "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", + "integrity": "sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==", + "dev": true + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -5115,8 +6839,7 @@ "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "functional-red-black-tree": { "version": "1.0.1", @@ -5124,6 +6847,11 @@ "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", "dev": true }, + "get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==" + }, "glob": { "version": "8.0.3", "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", @@ -5190,7 +6918,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "requires": { "function-bind": "^1.1.1" } @@ -5207,6 +6934,14 @@ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "requires": { + "react-is": "^16.7.0" + } + }, "html-loader": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-4.1.0.tgz", @@ -5240,6 +6975,39 @@ } } }, + "html-webpack-plugin": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.3.tgz", + "integrity": "sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg==", + "dev": true, + "requires": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + } + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + }, + "dependencies": { + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + } + } + }, "icss-utils": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", @@ -5263,7 +7031,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -5272,8 +7039,7 @@ "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" } } }, @@ -5315,11 +7081,23 @@ "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", "dev": true }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, "is-core-module": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", - "dev": true, "requires": { "has": "^1.0.3" } @@ -5377,6 +7155,11 @@ "supports-color": "^8.0.0" } }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -5389,8 +7172,7 @@ "json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" }, "json-schema-traverse": { "version": "0.4.1", @@ -5432,6 +7214,11 @@ "type-check": "~0.4.0" } }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, "lit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/lit/-/lit-2.3.0.tgz", @@ -5517,6 +7304,14 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, "lower-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", @@ -5677,6 +7472,20 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -5738,11 +7547,21 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, "requires": { "callsites": "^3.0.0" } }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, "parse5": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz", @@ -5783,14 +7602,12 @@ "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" }, "picocolors": { "version": "1.0.0", @@ -5888,6 +7705,32 @@ "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", "dev": true }, + "pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "dev": true, + "requires": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true + }, + "prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -5909,6 +7752,69 @@ "safe-buffer": "^5.1.0" } }, + "react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "requires": { + "loose-envify": "^1.1.0" + } + }, + "react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "requires": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "react-remove-scroll": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.6.tgz", + "integrity": "sha512-bO856ad1uDYLefgArk559IzUNeQ6SWH4QnrevIUjH+GczV56giDfl3h0Idptf2oIKxQmd1p9BN25jleKodTALg==", + "requires": { + "react-remove-scroll-bar": "^2.3.4", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + } + }, + "react-remove-scroll-bar": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz", + "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==", + "requires": { + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" + } + }, + "react-style-singleton": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", + "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", + "requires": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^2.0.0" + } + }, + "react-textarea-autosize": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.3.4.tgz", + "integrity": "sha512-CdtmP8Dc19xL8/R6sWvtknD/eCXkQr30dtvC4VmGInhRsfF8X/ihXCq6+9l9qbxmKRiq407/7z5fxE7cVWQNgQ==", + "requires": { + "@babel/runtime": "^7.10.2", + "use-composed-ref": "^1.3.0", + "use-latest": "^1.2.1" + } + }, "rechoir": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", @@ -5918,6 +7824,11 @@ "resolve": "^1.9.0" } }, + "regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, "regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", @@ -5930,6 +7841,19 @@ "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", "dev": true }, + "renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "dev": true, + "requires": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, "require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -5940,7 +7864,6 @@ "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, "requires": { "is-core-module": "^2.9.0", "path-parse": "^1.0.7", @@ -6046,6 +7969,14 @@ "neo-async": "^2.6.2" } }, + "scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "requires": { + "loose-envify": "^1.1.0" + } + }, "schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -6142,6 +8073,11 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, + "stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, "supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -6154,8 +8090,12 @@ "supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, + "tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==" }, "tapable": { "version": "2.2.1", @@ -6194,6 +8134,11 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==" + }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -6218,8 +8163,7 @@ "tslib": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "tsutils": { "version": "3.21.0", @@ -6278,12 +8222,55 @@ "punycode": "^2.1.0" } }, + "use-callback-ref": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz", + "integrity": "sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==", + "requires": { + "tslib": "^2.0.0" + } + }, + "use-composed-ref": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz", + "integrity": "sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==", + "requires": {} + }, + "use-isomorphic-layout-effect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", + "requires": {} + }, + "use-latest": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz", + "integrity": "sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==", + "requires": { + "use-isomorphic-layout-effect": "^1.1.1" + } + }, + "use-sidecar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", + "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "requires": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "dev": true + }, "v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", @@ -6409,6 +8396,11 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 9c4233d5..1e97c483 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,8 @@ "@types/chrome": "^0.0.193", "@types/jquery": "^3.5.14", "@types/lodash": "^4.14.195", + "@types/react": "^18.2.15", + "@types/react-dom": "^18.2.7", "@typescript-eslint/eslint-plugin": "^5.39.0", "@typescript-eslint/parser": "^5.39.0", "copy-webpack-plugin": "^11.0.0", @@ -38,8 +40,10 @@ "fast-json-stable-stringify": "^2.1.0", "file-loader": "^6.2.0", "filtrex": "^3.0.0", + "fs": "^0.0.1-security", "glob": "^8.0.3", "html-loader": "^4.1.0", + "html-webpack-plugin": "^5.5.3", "ignore-loader": "^0.1.2", "lit": "^2.3.0", "lit-html": "^2.3.1", @@ -47,11 +51,20 @@ "lodash-decorators": "^6.0.1", "mini-css-extract-plugin": "^2.6.1", "prettier": "^2.7.1", + "process": "^0.11.10", "rxjs": "^7.5.7", "sass-loader": "^13.0.2", "ts-loader": "^9.3.1", "typescript": "^4.7.4", "webpack": "^5.74.0", "webpack-cli": "^4.10.0" + }, + "dependencies": { + "@emotion/react": "^11.11.1", + "@mantine/core": "^6.0.17", + "@mantine/hooks": "^6.0.17", + "@tabler/icons-react": "^2.26.0", + "react": "^18.2.0", + "react-dom": "^18.2.0" } } diff --git a/src/pages/options/App.tsx b/src/pages/options/App.tsx new file mode 100644 index 00000000..80af819e --- /dev/null +++ b/src/pages/options/App.tsx @@ -0,0 +1,86 @@ +import { + Button, + Card, + Divider, + Flex, + Group, + Image, + NavLink, + Space, + Stack, + Switch, + Tabs, + Text, + ThemeIcon, + Title, + UnstyledButton, +} from '@mantine/core'; +import {AppShell, Navbar, Header} from '@mantine/core'; +import {IconBackpack, IconBuildingStore, IconGitPullRequest, IconInfoCircle, IconSettings} from '@tabler/icons-react'; +import {SettingsPage} from './settings/SettingsPage'; +import {useState} from 'react'; + +const ALL_PAGE_IDS = ['settings', 'about'] as const; + +type PageId = typeof ALL_PAGE_IDS[number]; + +const pageIdToComponent = (pageId: PageId) => { + switch (pageId) { + case 'settings': + return ; + case 'about': + return ; + } +}; + +export const App = () => { + const [activePageId, setActivePageId] = useState('settings'); + + return ( + + + Settings} + icon={ + + + + } + variant="light" + active={activePageId === 'settings'} + onClick={() => setActivePageId('settings')} + /> + + About} + icon={ + + + + } + variant="light" + active={activePageId === 'about'} + onClick={() => setActivePageId('about')} + /> + + + } + header={ +
+ + CSGOFloat Logo + Market Checker + +
+ } + styles={(theme) => ({ + main: {backgroundColor: theme.colorScheme === 'dark' ? theme.colors.dark[8] : theme.colors.gray[0]}, + })} + > + {pageIdToComponent(activePageId)} +
+ ); +}; diff --git a/src/pages/options/index.html b/src/pages/options/index.html new file mode 100644 index 00000000..f0b7fd32 --- /dev/null +++ b/src/pages/options/index.html @@ -0,0 +1,13 @@ + + + + + + + CSGOFloat Options + + + +
+ + diff --git a/src/pages/options/index.tsx b/src/pages/options/index.tsx new file mode 100644 index 00000000..76d4813d --- /dev/null +++ b/src/pages/options/index.tsx @@ -0,0 +1,13 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import {MantineProvider} from '@mantine/core'; +import {App} from './App'; + +const root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement); +root.render( + + + + + +); diff --git a/src/pages/options/settings/InventorySettings.tsx b/src/pages/options/settings/InventorySettings.tsx new file mode 100644 index 00000000..644ae015 --- /dev/null +++ b/src/pages/options/settings/InventorySettings.tsx @@ -0,0 +1,32 @@ +import {Card, Divider, Flex, Space, Switch, Text, Title} from '@mantine/core'; + +export const InventorySettings = () => { + return ( + + + Inventory Settings + Configure CSGOFloat Market Checker features in inventories. + + + + + + + Paint Seed + Show the paint seed of items in an inventory. + + + + + + + + + Smart Filter/Sort + Shows the smart filter and sort buttons in a listing. + + + + + ); +}; diff --git a/src/pages/options/settings/MarketSettings.tsx b/src/pages/options/settings/MarketSettings.tsx new file mode 100644 index 00000000..bd19806f --- /dev/null +++ b/src/pages/options/settings/MarketSettings.tsx @@ -0,0 +1,34 @@ +import {Card, Divider, Flex, Space, Switch, Text, Title} from '@mantine/core'; + +export const MarketSettings = () => { + return ( + + + Market Settings + Configure CSGOFloat Market Checker features in the market page and its listings. + + + + + + + 3D/Screenshot Buttons + + Shows buttons under a listing to quickly view 3d model or screenshot of the specific item. + + + + + + + + + + Smart Filter/Sort + Shows the smart filter and sort buttons in a listing. + + + + + ); +}; diff --git a/src/pages/options/settings/SettingsPage.tsx b/src/pages/options/settings/SettingsPage.tsx new file mode 100644 index 00000000..87efe14c --- /dev/null +++ b/src/pages/options/settings/SettingsPage.tsx @@ -0,0 +1,27 @@ +import {Card, Divider, Flex, Space, Switch, Tabs, Text, Title} from '@mantine/core'; +import {IconBackpack, IconBuildingStore} from '@tabler/icons-react'; +import {MarketSettings} from './MarketSettings'; +import {InventorySettings} from './InventorySettings'; + +export const SettingsPage = () => { + return ( + + + }> + Market + + }> + Inventory + + + + + + + + + + + + ); +}; diff --git a/src/pages/wow/index.html b/src/pages/wow/index.html new file mode 100644 index 00000000..f0b7fd32 --- /dev/null +++ b/src/pages/wow/index.html @@ -0,0 +1,13 @@ + + + + + + + CSGOFloat Options + + + +
+ + diff --git a/src/pages/wow/index.tsx b/src/pages/wow/index.tsx new file mode 100644 index 00000000..b0c07439 --- /dev/null +++ b/src/pages/wow/index.tsx @@ -0,0 +1,9 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; + +const root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement); +root.render( + +
yo
+
+); diff --git a/tsconfig.json b/tsconfig.json index d08a0da7..411a97f2 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,7 +11,8 @@ "typeRoots": ["node_modules/@types", "./src/lib/types"], "experimentalDecorators": true, "useDefineForClassFields": false, - "moduleResolution": "Node" + "moduleResolution": "Node", + "jsx": "react-jsx" }, "exclude": ["dist/"] } diff --git a/webpack.config.js b/webpack.config.js index 42e5e76e..df18a45d 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,7 +1,9 @@ const path = require('path'); const glob = require('glob'); +const fs = require('fs'); const CopyPlugin = require('copy-webpack-plugin'); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); +const HtmlWebpackPlugin = require('html-webpack-plugin'); const webpack = require('webpack'); const CHROME_KEY = @@ -27,19 +29,23 @@ module.exports = (env) => { getPathEntries('./src/lib/page_scripts/*.ts'), getPathEntries('./src/lib/types/*.d.ts'), getPathEntries('./src/background.ts'), - getPathEntries('./src/**/*.js') + getPathEntries('./src/**/*.js'), + getPathEntries('./src/pages/**/*.tsx') ), output: { path: path.join(__dirname, 'dist'), filename: '[name].js', }, resolve: { - extensions: ['.ts', '.js', '.html'], + alias: { + process: 'process/browser', + }, + extensions: ['.ts', '.js', '.html', '.tsx'], }, module: { rules: [ { - test: /\.ts$/, + test: /\.(ts|tsx)$/, loader: 'ts-loader', exclude: /node_modules|\.d\.ts$/, }, @@ -58,6 +64,9 @@ module.exports = (env) => { ], }, plugins: [ + new webpack.ProvidePlugin({ + process: 'process/browser', + }), new MiniCssExtractPlugin(), new webpack.SourceMapDevToolPlugin({}), new CopyPlugin({ @@ -84,6 +93,15 @@ module.exports = (env) => { }, ], }), + ...fs.readdirSync(path.join(__dirname, 'src', 'pages')).map( + (pageName) => + new HtmlWebpackPlugin({ + template: path.join(__dirname, 'src', 'pages', pageName, 'index.html'), + filename: `./src/pages/${pageName}/index.html`, + chunks: [`./src/pages/${pageName}/index`], + cache: false, + }) + ), ], stats: { errorDetails: true, From 9663c8bb9627d23969f7cfa40f5944cd3fcb9840 Mon Sep 17 00:00:00 2001 From: ayoung19 Date: Thu, 20 Jul 2023 01:29:56 -0700 Subject: [PATCH 02/23] Add settings manipulation --- .eslintrc | 40 +++++++------- package-lock.json | 24 ++++++++- package.json | 3 +- src/background.ts | 12 +++++ .../options/settings/InventorySettings.tsx | 18 +++---- src/pages/options/settings/MarketSettings.tsx | 22 ++++++-- src/pages/options/settings/SettingsForm.tsx | 52 +++++++++++++++++++ src/pages/options/settings/SettingsPage.tsx | 43 ++++++++------- src/pages/options/utils.ts | 13 +++++ tsconfig.json | 2 +- 10 files changed, 170 insertions(+), 59 deletions(-) create mode 100644 src/pages/options/settings/SettingsForm.tsx create mode 100644 src/pages/options/utils.ts diff --git a/.eslintrc b/.eslintrc index ebb18b77..2a9d1930 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,22 +1,22 @@ { - "parser": "@typescript-eslint/parser", - "parserOptions": { - "ecmaVersion": 12, - "sourceType": "module" - }, - "plugins": ["@typescript-eslint"], - "extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended", "prettier"], - "rules": { - "@typescript-eslint/no-non-null-assertion": "off", - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/no-inferrable-types": "off", - "@typescript-eslint/ban-ts-comment": "off", - "@typescript-eslint/no-empty-function": "off", - "@typescript-eslint/no-unused-vars": "off", - "@typescript-eslint/no-empty-interface": "off" - }, - "env": { - "browser": true, - "es2021": true - } + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": 12, + "sourceType": "module" + }, + "plugins": ["@typescript-eslint"], + "extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended", "prettier"], + "rules": { + "@typescript-eslint/no-non-null-assertion": "off", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-inferrable-types": "off", + "@typescript-eslint/ban-ts-comment": "off", + "@typescript-eslint/no-empty-function": "off", + "@typescript-eslint/no-unused-vars": "off", + "@typescript-eslint/no-empty-interface": "off" + }, + "env": { + "browser": true, + "es2021": true + } } diff --git a/package-lock.json b/package-lock.json index e5bfc80e..65b47005 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,8 @@ "@mantine/hooks": "^6.0.17", "@tabler/icons-react": "^2.26.0", "react": "^18.2.0", - "react-dom": "^18.2.0" + "react-dom": "^18.2.0", + "react-hook-form": "^7.45.2" }, "devDependencies": { "@types/chrome": "^0.0.193", @@ -3858,6 +3859,21 @@ "react": "^18.2.0" } }, + "node_modules/react-hook-form": { + "version": "7.45.2", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.45.2.tgz", + "integrity": "sha512-9s45OdTaKN+4NSTbXVqeDITd/nwIg++nxJGL8+OD5uf1DxvhsXQ641kaYHk5K28cpIOTYm71O/fYk7rFaygb3A==", + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18" + } + }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -7769,6 +7785,12 @@ "scheduler": "^0.23.0" } }, + "react-hook-form": { + "version": "7.45.2", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.45.2.tgz", + "integrity": "sha512-9s45OdTaKN+4NSTbXVqeDITd/nwIg++nxJGL8+OD5uf1DxvhsXQ641kaYHk5K28cpIOTYm71O/fYk7rFaygb3A==", + "requires": {} + }, "react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", diff --git a/package.json b/package.json index 1e97c483..233aa845 100644 --- a/package.json +++ b/package.json @@ -65,6 +65,7 @@ "@mantine/hooks": "^6.0.17", "@tabler/icons-react": "^2.26.0", "react": "^18.2.0", - "react-dom": "^18.2.0" + "react-dom": "^18.2.0", + "react-hook-form": "^7.45.2" } } diff --git a/src/background.ts b/src/background.ts index 56d3aeb3..7d8e02f0 100644 --- a/src/background.ts +++ b/src/background.ts @@ -1,6 +1,7 @@ import {Handle} from './lib/bridge/server'; import {InternalResponseBundle} from './lib/bridge/types'; import MessageSender = chrome.runtime.MessageSender; +import {DEFAULT_SETTINGS} from './pages/options/utils'; function unifiedHandler(request: any, sender: MessageSender, sendResponse: (response?: any) => void) { Handle(request, sender) @@ -29,3 +30,14 @@ chrome.runtime.onMessageExternal.addListener((request, sender, sendResponse) => unifiedHandler(request, sender, sendResponse); return true; }); + +chrome.storage.local.get('csgofloat-settings', (data) => { + const settings = data['csgofloat-settings'] || {}; + + chrome.storage.local.set({ + 'csgofloat-settings': { + ...DEFAULT_SETTINGS, + ...settings, + }, + }); +}); diff --git a/src/pages/options/settings/InventorySettings.tsx b/src/pages/options/settings/InventorySettings.tsx index 644ae015..2785213b 100644 --- a/src/pages/options/settings/InventorySettings.tsx +++ b/src/pages/options/settings/InventorySettings.tsx @@ -1,6 +1,12 @@ import {Card, Divider, Flex, Space, Switch, Text, Title} from '@mantine/core'; +import {SettingsType} from '../utils'; +import {Control} from 'react-hook-form'; -export const InventorySettings = () => { +interface InventorySettingsProps { + control: Control; +} + +export const InventorySettings = ({control}: InventorySettingsProps) => { return ( @@ -17,16 +23,6 @@ export const InventorySettings = () => { - - - - - - Smart Filter/Sort - Shows the smart filter and sort buttons in a listing. - - - ); }; diff --git a/src/pages/options/settings/MarketSettings.tsx b/src/pages/options/settings/MarketSettings.tsx index bd19806f..1a3d7147 100644 --- a/src/pages/options/settings/MarketSettings.tsx +++ b/src/pages/options/settings/MarketSettings.tsx @@ -1,6 +1,12 @@ import {Card, Divider, Flex, Space, Switch, Text, Title} from '@mantine/core'; +import {Control, Controller} from 'react-hook-form'; +import {SettingsType} from '../utils'; -export const MarketSettings = () => { +interface MarketSettingsProps { + control: Control; +} + +export const MarketSettings = ({control}: MarketSettingsProps) => { return ( @@ -17,7 +23,12 @@ export const MarketSettings = () => { Shows buttons under a listing to quickly view 3d model or screenshot of the specific item. - + + } + /> @@ -27,7 +38,12 @@ export const MarketSettings = () => { Smart Filter/Sort Shows the smart filter and sort buttons in a listing. - + + } + /> ); diff --git a/src/pages/options/settings/SettingsForm.tsx b/src/pages/options/settings/SettingsForm.tsx new file mode 100644 index 00000000..6514e143 --- /dev/null +++ b/src/pages/options/settings/SettingsForm.tsx @@ -0,0 +1,52 @@ +import {Card, Divider, Flex, Space, Switch, Tabs, Text, Title} from '@mantine/core'; +import {IconBackpack, IconBuildingStore} from '@tabler/icons-react'; +import {SettingsType} from '../utils'; +import {Controller, useForm} from 'react-hook-form'; +import {useEffect} from 'react'; +import {MarketSettings} from './MarketSettings'; +import {InventorySettings} from './InventorySettings'; + +interface SettingsFormProps { + settings: SettingsType; +} + +export const SettingsForm = ({settings}: SettingsFormProps) => { + const { + handleSubmit, + control, + formState: {isDirty}, + reset, + } = useForm({ + defaultValues: settings, + }); + + useEffect(() => { + if (isDirty) { + handleSubmit((data) => { + chrome.storage.local.set({'csgofloat-settings': data}); + reset(data); + })(); + } + }, [isDirty]); + + return ( + + + }> + Market + + }> + Inventory + + + + + + + + + + + + ); +}; diff --git a/src/pages/options/settings/SettingsPage.tsx b/src/pages/options/settings/SettingsPage.tsx index 87efe14c..d9de6ef0 100644 --- a/src/pages/options/settings/SettingsPage.tsx +++ b/src/pages/options/settings/SettingsPage.tsx @@ -1,27 +1,26 @@ -import {Card, Divider, Flex, Space, Switch, Tabs, Text, Title} from '@mantine/core'; -import {IconBackpack, IconBuildingStore} from '@tabler/icons-react'; -import {MarketSettings} from './MarketSettings'; -import {InventorySettings} from './InventorySettings'; +import {Loader} from '@mantine/core'; +import {useEffect, useState} from 'react'; +import {DEFAULT_SETTINGS, SettingsType} from '../utils'; +import {SettingsForm} from './SettingsForm'; export const SettingsPage = () => { - return ( - - - }> - Market - - }> - Inventory - - + const [settings, setSettings] = useState(); - - - + useEffect(() => { + try { + chrome.storage.local.get('csgofloat-settings', (data) => { + const existingSettings = data['csgofloat-settings'] || {}; - - - - - ); + setSettings({...DEFAULT_SETTINGS, ...existingSettings} as SettingsType); + }); + } catch { + setSettings(DEFAULT_SETTINGS); + } + }, []); + + if (settings === undefined) { + return ; + } + + return ; }; diff --git a/src/pages/options/utils.ts b/src/pages/options/utils.ts new file mode 100644 index 00000000..14b9fddd --- /dev/null +++ b/src/pages/options/utils.ts @@ -0,0 +1,13 @@ +export interface SettingsType { + market: { + '3d-screenshot-buttons': boolean; + 'smart-filter-sort': boolean; + }; +} + +export const DEFAULT_SETTINGS: SettingsType = { + market: { + '3d-screenshot-buttons': true, + 'smart-filter-sort': true, + }, +}; diff --git a/tsconfig.json b/tsconfig.json index 411a97f2..5d5528fe 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,7 +11,7 @@ "typeRoots": ["node_modules/@types", "./src/lib/types"], "experimentalDecorators": true, "useDefineForClassFields": false, - "moduleResolution": "Node", + "moduleResolution": "node", "jsx": "react-jsx" }, "exclude": ["dist/"] From 57ec43115bb139f1effc1f2e6de09c0693f435de Mon Sep 17 00:00:00 2001 From: ayoung19 Date: Thu, 20 Jul 2023 05:14:24 -0700 Subject: [PATCH 03/23] Add functionality --- src/background.ts | 16 ++--- src/lib/components/market/skin_viewer.ts | 67 +++++++++++-------- src/lib/storage/keys.ts | 3 + .../options/settings/InventorySettings.tsx | 11 ++- src/pages/options/settings/MarketSettings.tsx | 2 +- src/pages/options/settings/SettingsForm.tsx | 10 +-- src/pages/options/settings/SettingsPage.tsx | 18 +++-- src/pages/wow/index.html | 13 ---- src/pages/wow/index.tsx | 9 --- src/{pages/options/utils.ts => settings.ts} | 6 ++ 10 files changed, 78 insertions(+), 77 deletions(-) delete mode 100644 src/pages/wow/index.html delete mode 100644 src/pages/wow/index.tsx rename src/{pages/options/utils.ts => settings.ts} (72%) diff --git a/src/background.ts b/src/background.ts index 7d8e02f0..992b4e1f 100644 --- a/src/background.ts +++ b/src/background.ts @@ -1,7 +1,9 @@ import {Handle} from './lib/bridge/server'; import {InternalResponseBundle} from './lib/bridge/types'; import MessageSender = chrome.runtime.MessageSender; -import {DEFAULT_SETTINGS} from './pages/options/utils'; +import {DEFAULT_SETTINGS, SettingsType} from './settings'; +import {StorageKey} from './lib/storage/keys'; +import {gStore} from './lib/storage/store'; function unifiedHandler(request: any, sender: MessageSender, sendResponse: (response?: any) => void) { Handle(request, sender) @@ -31,13 +33,9 @@ chrome.runtime.onMessageExternal.addListener((request, sender, sendResponse) => return true; }); -chrome.storage.local.get('csgofloat-settings', (data) => { - const settings = data['csgofloat-settings'] || {}; - - chrome.storage.local.set({ - 'csgofloat-settings': { - ...DEFAULT_SETTINGS, - ...settings, - }, +gStore.get(StorageKey.SETTINGS).then((settings) => { + gStore.set(StorageKey.SETTINGS, { + ...DEFAULT_SETTINGS, + ...(settings || {}), }); }); diff --git a/src/lib/components/market/skin_viewer.ts b/src/lib/components/market/skin_viewer.ts index 3909c746..6680d2b3 100644 --- a/src/lib/components/market/skin_viewer.ts +++ b/src/lib/components/market/skin_viewer.ts @@ -11,6 +11,8 @@ import {getMarketInspectLink} from './helpers'; import {rgAsset, ListingData} from '../../types/steam'; import {AppId, ContextId} from '../../types/steam_constants'; import {isSkin} from '../../utils/skin'; +import {Get} from '../../bridge/handlers/storage_get'; +import {SETTINGS} from '../../storage/keys'; enum Showing { NONE, @@ -74,8 +76,15 @@ export class SkinViewer extends FloatElement { @state() private showing: Showing = Showing.NONE; + @state() + private isEnabled = false; + async connectedCallback() { super.connectedCallback(); + + const settings = await Get(SETTINGS); + + this.isEnabled = !!settings && settings.market['3d-screenshot-buttons']; } loadingIfApplicable(text: string, type: Showing) { @@ -95,34 +104,36 @@ export class SkinViewer extends FloatElement { return nothing; } - return html` -
- - - -
- ${this.showing === Showing.MODEL && this.response?.modelLink - ? html` -
- -
- ` - : nothing} - - `; + return this.isEnabled + ? html` +
+ + + +
+ ${this.showing === Showing.MODEL && this.response?.modelLink + ? html` +
+ +
+ ` + : nothing} + + ` + : nothing; } async fetchModel() { diff --git a/src/lib/storage/keys.ts b/src/lib/storage/keys.ts index 4683c588..21069f59 100644 --- a/src/lib/storage/keys.ts +++ b/src/lib/storage/keys.ts @@ -1,6 +1,7 @@ /** * Keys for use as the raw "key" in local/sync storage for a row */ +import {SettingsType} from '../../settings'; import {SerializedFilter} from '../filter/types'; export enum StorageKey { @@ -8,6 +9,7 @@ export enum StorageKey { PAGE_SIZE = 'pageSize', ITEM_FILTERS = 'expressions', GLOBAL_FILTERS = 'global', + SETTINGS = 'settings', } export type DynamicStorageKey = string; @@ -45,3 +47,4 @@ export const PAGE_SIZE = newRow(StorageKey.PAGE_SIZE); // Dynamic prefixes should be the market hash name of the item export const DYNAMIC_ITEM_FILTERS = newDynamicRow(StorageKey.ITEM_FILTERS); export const GLOBAL_FILTERS = newRow(StorageKey.GLOBAL_FILTERS); +export const SETTINGS = newRow(StorageKey.SETTINGS); diff --git a/src/pages/options/settings/InventorySettings.tsx b/src/pages/options/settings/InventorySettings.tsx index 2785213b..211b5041 100644 --- a/src/pages/options/settings/InventorySettings.tsx +++ b/src/pages/options/settings/InventorySettings.tsx @@ -1,6 +1,6 @@ import {Card, Divider, Flex, Space, Switch, Text, Title} from '@mantine/core'; -import {SettingsType} from '../utils'; -import {Control} from 'react-hook-form'; +import {Control, Controller} from 'react-hook-form'; +import {SettingsType} from '../../../settings'; interface InventorySettingsProps { control: Control; @@ -21,7 +21,12 @@ export const InventorySettings = ({control}: InventorySettingsProps) => { Paint Seed Show the paint seed of items in an inventory. - + + } + /> ); diff --git a/src/pages/options/settings/MarketSettings.tsx b/src/pages/options/settings/MarketSettings.tsx index 1a3d7147..7e93e06d 100644 --- a/src/pages/options/settings/MarketSettings.tsx +++ b/src/pages/options/settings/MarketSettings.tsx @@ -1,6 +1,6 @@ import {Card, Divider, Flex, Space, Switch, Text, Title} from '@mantine/core'; import {Control, Controller} from 'react-hook-form'; -import {SettingsType} from '../utils'; +import {SettingsType} from '../../../settings'; interface MarketSettingsProps { control: Control; diff --git a/src/pages/options/settings/SettingsForm.tsx b/src/pages/options/settings/SettingsForm.tsx index 6514e143..596be18b 100644 --- a/src/pages/options/settings/SettingsForm.tsx +++ b/src/pages/options/settings/SettingsForm.tsx @@ -1,10 +1,12 @@ -import {Card, Divider, Flex, Space, Switch, Tabs, Text, Title} from '@mantine/core'; +import {Tabs} from '@mantine/core'; import {IconBackpack, IconBuildingStore} from '@tabler/icons-react'; -import {SettingsType} from '../utils'; -import {Controller, useForm} from 'react-hook-form'; +import {useForm} from 'react-hook-form'; import {useEffect} from 'react'; import {MarketSettings} from './MarketSettings'; import {InventorySettings} from './InventorySettings'; +import {SettingsType} from '../../../settings'; +import {gStore} from '../../../lib/storage/store'; +import {StorageKey} from '../../../lib/storage/keys'; interface SettingsFormProps { settings: SettingsType; @@ -23,7 +25,7 @@ export const SettingsForm = ({settings}: SettingsFormProps) => { useEffect(() => { if (isDirty) { handleSubmit((data) => { - chrome.storage.local.set({'csgofloat-settings': data}); + gStore.set(StorageKey.SETTINGS, data); reset(data); })(); } diff --git a/src/pages/options/settings/SettingsPage.tsx b/src/pages/options/settings/SettingsPage.tsx index d9de6ef0..9df56cc7 100644 --- a/src/pages/options/settings/SettingsPage.tsx +++ b/src/pages/options/settings/SettingsPage.tsx @@ -1,21 +1,19 @@ import {Loader} from '@mantine/core'; import {useEffect, useState} from 'react'; -import {DEFAULT_SETTINGS, SettingsType} from '../utils'; + import {SettingsForm} from './SettingsForm'; +import {DEFAULT_SETTINGS, SettingsType} from '../../../settings'; +import {gStore} from '../../../lib/storage/store'; +import {StorageKey} from '../../../lib/storage/keys'; export const SettingsPage = () => { const [settings, setSettings] = useState(); useEffect(() => { - try { - chrome.storage.local.get('csgofloat-settings', (data) => { - const existingSettings = data['csgofloat-settings'] || {}; - - setSettings({...DEFAULT_SETTINGS, ...existingSettings} as SettingsType); - }); - } catch { - setSettings(DEFAULT_SETTINGS); - } + gStore + .get(StorageKey.SETTINGS) + .then((settings) => setSettings({...DEFAULT_SETTINGS, ...(settings || {})})) + .catch(() => setSettings(DEFAULT_SETTINGS)); }, []); if (settings === undefined) { diff --git a/src/pages/wow/index.html b/src/pages/wow/index.html deleted file mode 100644 index f0b7fd32..00000000 --- a/src/pages/wow/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - CSGOFloat Options - - - -
- - diff --git a/src/pages/wow/index.tsx b/src/pages/wow/index.tsx deleted file mode 100644 index b0c07439..00000000 --- a/src/pages/wow/index.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import React from 'react'; -import ReactDOM from 'react-dom/client'; - -const root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement); -root.render( - -
yo
-
-); diff --git a/src/pages/options/utils.ts b/src/settings.ts similarity index 72% rename from src/pages/options/utils.ts rename to src/settings.ts index 14b9fddd..e5b32c14 100644 --- a/src/pages/options/utils.ts +++ b/src/settings.ts @@ -3,6 +3,9 @@ export interface SettingsType { '3d-screenshot-buttons': boolean; 'smart-filter-sort': boolean; }; + inventory: { + 'paint-seed': boolean; + }; } export const DEFAULT_SETTINGS: SettingsType = { @@ -10,4 +13,7 @@ export const DEFAULT_SETTINGS: SettingsType = { '3d-screenshot-buttons': true, 'smart-filter-sort': true, }, + inventory: { + 'paint-seed': true, + }, }; From 40695fdcc9fc244dd861e316e35dd33fb2b79b01 Mon Sep 17 00:00:00 2001 From: ayoung19 Date: Thu, 20 Jul 2023 15:30:44 -0700 Subject: [PATCH 04/23] Remove about page and inventory settings --- package-lock.json | 24 +++++++++----- src/pages/options/App.tsx | 16 +-------- .../options/settings/InventorySettings.tsx | 33 ------------------- src/pages/options/settings/MarketSettings.tsx | 15 --------- src/pages/options/settings/SettingsForm.tsx | 8 ----- src/settings.ts | 8 ----- 6 files changed, 17 insertions(+), 87 deletions(-) delete mode 100644 src/pages/options/settings/InventorySettings.tsx diff --git a/package-lock.json b/package-lock.json index c835e4dd..55546746 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5881,7 +5881,8 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", - "dev": true + "dev": true, + "requires": {} }, "@webpack-cli/info": { "version": "1.5.0", @@ -5896,7 +5897,8 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", - "dev": true + "dev": true, + "requires": {} }, "@xtuc/ieee754": { "version": "1.2.0", @@ -5920,13 +5922,15 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true + "dev": true, + "requires": {} }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true + "dev": true, + "requires": {} }, "ajv": { "version": "6.12.6", @@ -5973,7 +5977,8 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true + "dev": true, + "requires": {} }, "ansi-regex": { "version": "5.0.1", @@ -6627,7 +6632,8 @@ "version": "8.5.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", - "dev": true + "dev": true, + "requires": {} }, "eslint-scope": { "version": "5.1.1", @@ -7035,7 +7041,8 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true + "dev": true, + "requires": {} }, "ignore": { "version": "5.2.0", @@ -7667,7 +7674,8 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true + "dev": true, + "requires": {} }, "postcss-modules-local-by-default": { "version": "4.0.0", diff --git a/src/pages/options/App.tsx b/src/pages/options/App.tsx index 80af819e..f58ee580 100644 --- a/src/pages/options/App.tsx +++ b/src/pages/options/App.tsx @@ -20,7 +20,7 @@ import {IconBackpack, IconBuildingStore, IconGitPullRequest, IconInfoCircle, Ico import {SettingsPage} from './settings/SettingsPage'; import {useState} from 'react'; -const ALL_PAGE_IDS = ['settings', 'about'] as const; +const ALL_PAGE_IDS = ['settings'] as const; type PageId = typeof ALL_PAGE_IDS[number]; @@ -28,8 +28,6 @@ const pageIdToComponent = (pageId: PageId) => { switch (pageId) { case 'settings': return ; - case 'about': - return ; } }; @@ -53,18 +51,6 @@ export const App = () => { active={activePageId === 'settings'} onClick={() => setActivePageId('settings')} /> - - About} - icon={ - - - - } - variant="light" - active={activePageId === 'about'} - onClick={() => setActivePageId('about')} - /> } diff --git a/src/pages/options/settings/InventorySettings.tsx b/src/pages/options/settings/InventorySettings.tsx deleted file mode 100644 index 211b5041..00000000 --- a/src/pages/options/settings/InventorySettings.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import {Card, Divider, Flex, Space, Switch, Text, Title} from '@mantine/core'; -import {Control, Controller} from 'react-hook-form'; -import {SettingsType} from '../../../settings'; - -interface InventorySettingsProps { - control: Control; -} - -export const InventorySettings = ({control}: InventorySettingsProps) => { - return ( - - - Inventory Settings - Configure CSGOFloat Market Checker features in inventories. - - - - - - - Paint Seed - Show the paint seed of items in an inventory. - - - } - /> - - - ); -}; diff --git a/src/pages/options/settings/MarketSettings.tsx b/src/pages/options/settings/MarketSettings.tsx index 7e93e06d..d9222f8a 100644 --- a/src/pages/options/settings/MarketSettings.tsx +++ b/src/pages/options/settings/MarketSettings.tsx @@ -30,21 +30,6 @@ export const MarketSettings = ({control}: MarketSettingsProps) => { render={({field: {value, ...rest}}) => } /> - - - - - - Smart Filter/Sort - Shows the smart filter and sort buttons in a listing. - - - } - /> - ); }; diff --git a/src/pages/options/settings/SettingsForm.tsx b/src/pages/options/settings/SettingsForm.tsx index 596be18b..cde0ea73 100644 --- a/src/pages/options/settings/SettingsForm.tsx +++ b/src/pages/options/settings/SettingsForm.tsx @@ -3,7 +3,6 @@ import {IconBackpack, IconBuildingStore} from '@tabler/icons-react'; import {useForm} from 'react-hook-form'; import {useEffect} from 'react'; import {MarketSettings} from './MarketSettings'; -import {InventorySettings} from './InventorySettings'; import {SettingsType} from '../../../settings'; import {gStore} from '../../../lib/storage/store'; import {StorageKey} from '../../../lib/storage/keys'; @@ -37,18 +36,11 @@ export const SettingsForm = ({settings}: SettingsFormProps) => { }> Market - }> - Inventory - - - - - ); }; diff --git a/src/settings.ts b/src/settings.ts index e5b32c14..b50b3515 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -1,19 +1,11 @@ export interface SettingsType { market: { '3d-screenshot-buttons': boolean; - 'smart-filter-sort': boolean; - }; - inventory: { - 'paint-seed': boolean; }; } export const DEFAULT_SETTINGS: SettingsType = { market: { '3d-screenshot-buttons': true, - 'smart-filter-sort': true, - }, - inventory: { - 'paint-seed': true, }, }; From fc1c3d2648c6f5e31243ef16f8609b380fa17d20 Mon Sep 17 00:00:00 2001 From: ayoung19 Date: Fri, 21 Jul 2023 00:09:14 -0700 Subject: [PATCH 05/23] Add settings button, still needs to support firefox --- src/lib/bridge/handlers/handlers.ts | 2 + src/lib/bridge/handlers/open_options_page.ts | 19 ++++++++ src/lib/bridge/handlers/types.ts | 1 + src/lib/components/market/utility_belt.ts | 47 ++++++++++++++++++-- 4 files changed, 66 insertions(+), 3 deletions(-) create mode 100644 src/lib/bridge/handlers/open_options_page.ts diff --git a/src/lib/bridge/handlers/handlers.ts b/src/lib/bridge/handlers/handlers.ts index d76b0d9e..807825b1 100644 --- a/src/lib/bridge/handlers/handlers.ts +++ b/src/lib/bridge/handlers/handlers.ts @@ -11,6 +11,7 @@ import {FetchSkinModel} from './fetch_skin_model'; import {StorageRemove} from './storage_remove'; import {RequestType} from './types'; import {FetchExtensionFile} from './fetch_extension_file'; +import {OpenOptionsPage} from './open_options_page'; export const HANDLERS_MAP: {[key in RequestType]: RequestHandler} = { [RequestType.EXECUTE_SCRIPT_ON_PAGE]: ExecuteScriptOnPage, @@ -24,4 +25,5 @@ export const HANDLERS_MAP: {[key in RequestType]: RequestHandler} = { [RequestType.FETCH_PENDING_TRADES]: FetchPendingTrades, [RequestType.FETCH_SKIN_MODEL]: FetchSkinModel, [RequestType.FETCH_EXTENSION_FILE]: FetchExtensionFile, + [RequestType.OPEN_OPTIONS_PAGE]: OpenOptionsPage, }; diff --git a/src/lib/bridge/handlers/open_options_page.ts b/src/lib/bridge/handlers/open_options_page.ts new file mode 100644 index 00000000..1a905374 --- /dev/null +++ b/src/lib/bridge/handlers/open_options_page.ts @@ -0,0 +1,19 @@ +import {RequestHandler} from '../types'; +import {RequestType} from './types'; +import {isFirefox} from '../../utils/detect'; + +class OpenOptionsPageHandler implements RequestHandler { + getType(): RequestType { + return RequestType.OPEN_OPTIONS_PAGE; + } + + async handleRequest(request: undefined, sender: chrome.runtime.MessageSender): Promise { + if (isFirefox()) { + return await browser.runtime.openOptionsPage(); + } + + return chrome.runtime.openOptionsPage(); + } +} + +export const OpenOptionsPage = new OpenOptionsPageHandler(); diff --git a/src/lib/bridge/handlers/types.ts b/src/lib/bridge/handlers/types.ts index a92438f9..edc90828 100644 --- a/src/lib/bridge/handlers/types.ts +++ b/src/lib/bridge/handlers/types.ts @@ -10,4 +10,5 @@ export enum RequestType { FETCH_PENDING_TRADES, FETCH_SKIN_MODEL, FETCH_EXTENSION_FILE, + OPEN_OPTIONS_PAGE, } diff --git a/src/lib/components/market/utility_belt.ts b/src/lib/components/market/utility_belt.ts index f5754185..2cc66d44 100644 --- a/src/lib/components/market/utility_belt.ts +++ b/src/lib/components/market/utility_belt.ts @@ -6,6 +6,8 @@ import './page_size'; import './sort_listings'; import './ad_banner'; import '../filter/filter_container'; +import {ClientSend} from '../../bridge/client'; +import {OpenOptionsPage} from '../../bridge/handlers/open_options_page'; @CustomElement() @InjectBefore('#searchResultsRows', InjectionMode.ONCE) @@ -23,6 +25,23 @@ export class UtilityBelt extends FloatElement { background-color: rgba(0, 0, 0, 0.2); } + .buttons-container { + display: flex; + align-items: center; + } + + .settings-icon-wrapper { + padding: 4px; + margin-left: auto; + margin-right: 0; + border-radius: 4px; + display: inherit; + } + + .settings-icon-wrapper:hover { + background-color: rgba(0, 0, 0, 0.3); + } + .page-selector { margin-left: 10px; } @@ -38,9 +57,31 @@ export class UtilityBelt extends FloatElement { protected render(): HTMLTemplateResult { return html`
- - - Powered by CSGOFloat +
Date: Thu, 27 Jul 2023 09:30:05 -0700 Subject: [PATCH 06/23] Add suggestions --- src/lib/bridge/handlers/open_options_page.ts | 19 ++---- src/lib/components/market/skin_viewer.ts | 62 ++++++++++---------- 2 files changed, 38 insertions(+), 43 deletions(-) diff --git a/src/lib/bridge/handlers/open_options_page.ts b/src/lib/bridge/handlers/open_options_page.ts index 1a905374..a88b621e 100644 --- a/src/lib/bridge/handlers/open_options_page.ts +++ b/src/lib/bridge/handlers/open_options_page.ts @@ -1,19 +1,12 @@ import {RequestHandler} from '../types'; import {RequestType} from './types'; import {isFirefox} from '../../utils/detect'; +import {EmptyRequestHandler} from './main'; -class OpenOptionsPageHandler implements RequestHandler { - getType(): RequestType { - return RequestType.OPEN_OPTIONS_PAGE; +export const OpenOptionsPage = new EmptyRequestHandler(RequestType.OPEN_OPTIONS_PAGE, async () => { + if (isFirefox()) { + return await browser.runtime.openOptionsPage(); } - async handleRequest(request: undefined, sender: chrome.runtime.MessageSender): Promise { - if (isFirefox()) { - return await browser.runtime.openOptionsPage(); - } - - return chrome.runtime.openOptionsPage(); - } -} - -export const OpenOptionsPage = new OpenOptionsPageHandler(); + return chrome.runtime.openOptionsPage(); +}); diff --git a/src/lib/components/market/skin_viewer.ts b/src/lib/components/market/skin_viewer.ts index 6680d2b3..3f1cfa3a 100644 --- a/src/lib/components/market/skin_viewer.ts +++ b/src/lib/components/market/skin_viewer.ts @@ -104,36 +104,38 @@ export class SkinViewer extends FloatElement { return nothing; } - return this.isEnabled - ? html` -
- - - -
- ${this.showing === Showing.MODEL && this.response?.modelLink - ? html` -
- -
- ` - : nothing} - - ` - : nothing; + if (!this.isEnabled) { + return nothing; + } + + return html` +
+ + + +
+ ${this.showing === Showing.MODEL && this.response?.modelLink + ? html` +
+ +
+ ` + : nothing} + + `; } async fetchModel() { From 00b7ebcc4c9b8131dc60dc9d53f0e78ac84cfbc0 Mon Sep 17 00:00:00 2001 From: ayoung19 Date: Thu, 3 Aug 2023 01:14:57 -0700 Subject: [PATCH 07/23] Add get/set wrappers --- package-lock.json | 88 ++++++++++++++----- package.json | 4 +- src/background.ts | 10 --- src/lib/bridge/handlers/handlers.ts | 4 + src/lib/bridge/handlers/open_options_page.ts | 9 +- src/lib/bridge/handlers/settings_get.ts | 38 ++++++++ src/lib/bridge/handlers/settings_set.ts | 27 ++++++ src/lib/bridge/handlers/types.ts | 2 + src/lib/components/market/skin_viewer.ts | 7 +- src/lib/storage/keys.ts | 4 +- src/pages/options/index.tsx | 8 +- src/pages/options/settings/MarketSettings.tsx | 43 +++++---- src/pages/options/settings/SettingsForm.tsx | 46 ---------- src/pages/options/settings/SettingsPage.tsx | 34 ++++--- src/settings.ts | 43 +++++++-- webpack.config.js | 7 ++ 16 files changed, 233 insertions(+), 141 deletions(-) create mode 100644 src/lib/bridge/handlers/settings_get.ts create mode 100644 src/lib/bridge/handlers/settings_set.ts delete mode 100644 src/pages/options/settings/SettingsForm.tsx diff --git a/package-lock.json b/package-lock.json index 55546746..e9754b54 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,9 +13,9 @@ "@mantine/core": "^6.0.17", "@mantine/hooks": "^6.0.17", "@tabler/icons-react": "^2.26.0", + "@tanstack/react-query": "^4.32.1", "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-hook-form": "^7.45.2" + "react-dom": "^18.2.0" }, "devDependencies": { "@types/chrome": "^0.0.193", @@ -758,6 +758,41 @@ "react": "^16.5.1 || ^17.0.0 || ^18.0.0" } }, + "node_modules/@tanstack/query-core": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-4.32.1.tgz", + "integrity": "sha512-VEAGHboOFWN/bvf/7cCoeLQfld0AA8n0V/kfc77W+FvxnnSwJufEh6gfjqpX5bRE/DEYfYDYdNtuL3KM+lIs8Q==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-4.32.1.tgz", + "integrity": "sha512-lPTfOq6bR6DorPaS018gTMd3zs8r06tlERiVY6BRP9SnDkkl4ckqeANava/jPLWrSZP+EA15loQUTmvZs6k2GA==", + "dependencies": { + "@tanstack/query-core": "4.32.1", + "use-sync-external-store": "^1.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-native": "*" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, "node_modules/@types/chrome": { "version": "0.0.193", "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.193.tgz", @@ -3866,21 +3901,6 @@ "react": "^18.2.0" } }, - "node_modules/react-hook-form": { - "version": "7.45.2", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.45.2.tgz", - "integrity": "sha512-9s45OdTaKN+4NSTbXVqeDITd/nwIg++nxJGL8+OD5uf1DxvhsXQ641kaYHk5K28cpIOTYm71O/fYk7rFaygb3A==", - "engines": { - "node": ">=12.22.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/react-hook-form" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17 || ^18" - } - }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -4688,6 +4708,14 @@ } } }, + "node_modules/use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -5469,6 +5497,20 @@ "prop-types": "^15.7.2" } }, + "@tanstack/query-core": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-4.32.1.tgz", + "integrity": "sha512-VEAGHboOFWN/bvf/7cCoeLQfld0AA8n0V/kfc77W+FvxnnSwJufEh6gfjqpX5bRE/DEYfYDYdNtuL3KM+lIs8Q==" + }, + "@tanstack/react-query": { + "version": "4.32.1", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-4.32.1.tgz", + "integrity": "sha512-lPTfOq6bR6DorPaS018gTMd3zs8r06tlERiVY6BRP9SnDkkl4ckqeANava/jPLWrSZP+EA15loQUTmvZs6k2GA==", + "requires": { + "@tanstack/query-core": "4.32.1", + "use-sync-external-store": "^1.2.0" + } + }, "@types/chrome": { "version": "0.0.193", "resolved": "https://registry.npmjs.org/@types/chrome/-/chrome-0.0.193.tgz", @@ -7798,12 +7840,6 @@ "scheduler": "^0.23.0" } }, - "react-hook-form": { - "version": "7.45.2", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.45.2.tgz", - "integrity": "sha512-9s45OdTaKN+4NSTbXVqeDITd/nwIg++nxJGL8+OD5uf1DxvhsXQ641kaYHk5K28cpIOTYm71O/fYk7rFaygb3A==", - "requires": {} - }, "react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -8294,6 +8330,12 @@ "tslib": "^2.0.0" } }, + "use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "requires": {} + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", diff --git a/package.json b/package.json index e2ec1ad0..c8270aff 100644 --- a/package.json +++ b/package.json @@ -67,8 +67,8 @@ "@mantine/core": "^6.0.17", "@mantine/hooks": "^6.0.17", "@tabler/icons-react": "^2.26.0", + "@tanstack/react-query": "^4.32.1", "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-hook-form": "^7.45.2" + "react-dom": "^18.2.0" } } diff --git a/src/background.ts b/src/background.ts index 992b4e1f..56d3aeb3 100644 --- a/src/background.ts +++ b/src/background.ts @@ -1,9 +1,6 @@ import {Handle} from './lib/bridge/server'; import {InternalResponseBundle} from './lib/bridge/types'; import MessageSender = chrome.runtime.MessageSender; -import {DEFAULT_SETTINGS, SettingsType} from './settings'; -import {StorageKey} from './lib/storage/keys'; -import {gStore} from './lib/storage/store'; function unifiedHandler(request: any, sender: MessageSender, sendResponse: (response?: any) => void) { Handle(request, sender) @@ -32,10 +29,3 @@ chrome.runtime.onMessageExternal.addListener((request, sender, sendResponse) => unifiedHandler(request, sender, sendResponse); return true; }); - -gStore.get(StorageKey.SETTINGS).then((settings) => { - gStore.set(StorageKey.SETTINGS, { - ...DEFAULT_SETTINGS, - ...(settings || {}), - }); -}); diff --git a/src/lib/bridge/handlers/handlers.ts b/src/lib/bridge/handlers/handlers.ts index 807825b1..efd4aab2 100644 --- a/src/lib/bridge/handlers/handlers.ts +++ b/src/lib/bridge/handlers/handlers.ts @@ -12,6 +12,8 @@ import {StorageRemove} from './storage_remove'; import {RequestType} from './types'; import {FetchExtensionFile} from './fetch_extension_file'; import {OpenOptionsPage} from './open_options_page'; +import {SettingsGet} from './settings_get'; +import {SettingsSet} from './settings_set'; export const HANDLERS_MAP: {[key in RequestType]: RequestHandler} = { [RequestType.EXECUTE_SCRIPT_ON_PAGE]: ExecuteScriptOnPage, @@ -26,4 +28,6 @@ export const HANDLERS_MAP: {[key in RequestType]: RequestHandler} = { [RequestType.FETCH_SKIN_MODEL]: FetchSkinModel, [RequestType.FETCH_EXTENSION_FILE]: FetchExtensionFile, [RequestType.OPEN_OPTIONS_PAGE]: OpenOptionsPage, + [RequestType.SETTINGS_GET]: SettingsGet, + [RequestType.SETTINGS_SET]: SettingsSet, }; diff --git a/src/lib/bridge/handlers/open_options_page.ts b/src/lib/bridge/handlers/open_options_page.ts index a88b621e..23f8f704 100644 --- a/src/lib/bridge/handlers/open_options_page.ts +++ b/src/lib/bridge/handlers/open_options_page.ts @@ -1,12 +1,7 @@ -import {RequestHandler} from '../types'; import {RequestType} from './types'; -import {isFirefox} from '../../utils/detect'; +import {runtimeNamespace} from '../../utils/detect'; import {EmptyRequestHandler} from './main'; export const OpenOptionsPage = new EmptyRequestHandler(RequestType.OPEN_OPTIONS_PAGE, async () => { - if (isFirefox()) { - return await browser.runtime.openOptionsPage(); - } - - return chrome.runtime.openOptionsPage(); + return await runtimeNamespace().runtime.openOptionsPage(); }); diff --git a/src/lib/bridge/handlers/settings_get.ts b/src/lib/bridge/handlers/settings_get.ts new file mode 100644 index 00000000..65671d41 --- /dev/null +++ b/src/lib/bridge/handlers/settings_get.ts @@ -0,0 +1,38 @@ +import {RequestHandler} from '../types'; +import {gStore} from '../../storage/store'; +import {ClientSend} from '../client'; +import {DynamicStorageKey, StorageKey, StorageRow} from '../../storage/keys'; +import {RequestType} from './types'; +import {GetSetting, Settings} from '../../../settings'; + +interface SettingsGetRequest { + name: T; +} + +interface SettingsGetResponse { + value: Settings[T]; +} + +class SettingsGetHandler + implements RequestHandler, SettingsGetResponse> +{ + getType(): RequestType { + return RequestType.SETTINGS_GET; + } + + async handleRequest( + request: SettingsGetRequest, + sender: chrome.runtime.MessageSender + ): Promise> { + const value = await GetSetting(request.name); + + return {value}; + } +} + +export async function Get(name: T): Promise { + const resp = await ClientSend(new SettingsGetHandler(), {name}); + return resp.value; +} + +export const SettingsGet = new SettingsGetHandler(); diff --git a/src/lib/bridge/handlers/settings_set.ts b/src/lib/bridge/handlers/settings_set.ts new file mode 100644 index 00000000..ceba1fca --- /dev/null +++ b/src/lib/bridge/handlers/settings_set.ts @@ -0,0 +1,27 @@ +import {RequestHandler} from '../types'; +import {gStore} from '../../storage/store'; +import {ClientSend} from '../client'; +import {DynamicStorageKey, StorageKey, StorageRow} from '../../storage/keys'; +import {RequestType} from './types'; +import {SetSetting, Settings} from '../../../settings'; + +interface SettingsSetRequest { + name: T; + value: Settings[T]; +} + +class SettingsSetHandler implements RequestHandler, void> { + getType(): RequestType { + return RequestType.SETTINGS_SET; + } + + async handleRequest(request: SettingsSetRequest, sender: chrome.runtime.MessageSender): Promise { + await SetSetting(request.name, request.value); + } +} + +export async function Set(name: T, value: Settings[T]): Promise { + await ClientSend(new SettingsSetHandler(), {name, value}); +} + +export const SettingsSet = new SettingsSetHandler(); diff --git a/src/lib/bridge/handlers/types.ts b/src/lib/bridge/handlers/types.ts index edc90828..67362f27 100644 --- a/src/lib/bridge/handlers/types.ts +++ b/src/lib/bridge/handlers/types.ts @@ -11,4 +11,6 @@ export enum RequestType { FETCH_SKIN_MODEL, FETCH_EXTENSION_FILE, OPEN_OPTIONS_PAGE, + SETTINGS_GET, + SETTINGS_SET, } diff --git a/src/lib/components/market/skin_viewer.ts b/src/lib/components/market/skin_viewer.ts index 3f1cfa3a..1ddc7a7c 100644 --- a/src/lib/components/market/skin_viewer.ts +++ b/src/lib/components/market/skin_viewer.ts @@ -11,8 +11,7 @@ import {getMarketInspectLink} from './helpers'; import {rgAsset, ListingData} from '../../types/steam'; import {AppId, ContextId} from '../../types/steam_constants'; import {isSkin} from '../../utils/skin'; -import {Get} from '../../bridge/handlers/storage_get'; -import {SETTINGS} from '../../storage/keys'; +import {Get} from '../../bridge/handlers/settings_get'; enum Showing { NONE, @@ -82,9 +81,7 @@ export class SkinViewer extends FloatElement { async connectedCallback() { super.connectedCallback(); - const settings = await Get(SETTINGS); - - this.isEnabled = !!settings && settings.market['3d-screenshot-buttons']; + this.isEnabled = await Get('3d-screenshot-buttons'); } loadingIfApplicable(text: string, type: Showing) { diff --git a/src/lib/storage/keys.ts b/src/lib/storage/keys.ts index 21069f59..459898c3 100644 --- a/src/lib/storage/keys.ts +++ b/src/lib/storage/keys.ts @@ -1,7 +1,7 @@ /** * Keys for use as the raw "key" in local/sync storage for a row */ -import {SettingsType} from '../../settings'; +import {StoredSettings} from '../../settings'; import {SerializedFilter} from '../filter/types'; export enum StorageKey { @@ -47,4 +47,4 @@ export const PAGE_SIZE = newRow(StorageKey.PAGE_SIZE); // Dynamic prefixes should be the market hash name of the item export const DYNAMIC_ITEM_FILTERS = newDynamicRow(StorageKey.ITEM_FILTERS); export const GLOBAL_FILTERS = newRow(StorageKey.GLOBAL_FILTERS); -export const SETTINGS = newRow(StorageKey.SETTINGS); +export const SETTINGS = newRow(StorageKey.SETTINGS); diff --git a/src/pages/options/index.tsx b/src/pages/options/index.tsx index 76d4813d..35b07ee1 100644 --- a/src/pages/options/index.tsx +++ b/src/pages/options/index.tsx @@ -2,12 +2,18 @@ import React from 'react'; import ReactDOM from 'react-dom/client'; import {MantineProvider} from '@mantine/core'; import {App} from './App'; +import {QueryClient, QueryClientProvider} from '@tanstack/react-query'; const root = ReactDOM.createRoot(document.getElementById('root') as HTMLElement); + +const queryClient = new QueryClient(); + root.render( - + + + ); diff --git a/src/pages/options/settings/MarketSettings.tsx b/src/pages/options/settings/MarketSettings.tsx index d9222f8a..ff776e81 100644 --- a/src/pages/options/settings/MarketSettings.tsx +++ b/src/pages/options/settings/MarketSettings.tsx @@ -1,12 +1,16 @@ -import {Card, Divider, Flex, Space, Switch, Text, Title} from '@mantine/core'; -import {Control, Controller} from 'react-hook-form'; -import {SettingsType} from '../../../settings'; +import {Card, Divider, Flex, Skeleton, Space, Switch, Text, Title} from '@mantine/core'; +import {useMutation, useQuery, useQueryClient} from '@tanstack/react-query'; +import {GetSetting, SetSetting, Settings} from '../../../settings'; -interface MarketSettingsProps { - control: Control; -} +export const MarketSettings = () => { + const queryClient = useQueryClient(); + + const query = useQuery({queryKey: ['3d-screenshot-buttons'], queryFn: () => GetSetting('3d-screenshot-buttons')}); + const mutation = useMutation({ + mutationFn: (value) => SetSetting('3d-screenshot-buttons', value), + onSuccess: () => queryClient.invalidateQueries(['3d-screenshot-buttons']), + }); -export const MarketSettings = ({control}: MarketSettingsProps) => { return ( @@ -17,18 +21,21 @@ export const MarketSettings = ({control}: MarketSettingsProps) => { - - 3D/Screenshot Buttons - - Shows buttons under a listing to quickly view 3d model or screenshot of the specific item. - - + {query.isLoading ? ( + + ) : ( + <> + + 3D/Screenshot Buttons + + Shows buttons under a listing to quickly view 3d model or screenshot of the specific + item. + + - } - /> + mutation.mutate(e.currentTarget.checked)} /> + + )} ); diff --git a/src/pages/options/settings/SettingsForm.tsx b/src/pages/options/settings/SettingsForm.tsx deleted file mode 100644 index cde0ea73..00000000 --- a/src/pages/options/settings/SettingsForm.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import {Tabs} from '@mantine/core'; -import {IconBackpack, IconBuildingStore} from '@tabler/icons-react'; -import {useForm} from 'react-hook-form'; -import {useEffect} from 'react'; -import {MarketSettings} from './MarketSettings'; -import {SettingsType} from '../../../settings'; -import {gStore} from '../../../lib/storage/store'; -import {StorageKey} from '../../../lib/storage/keys'; - -interface SettingsFormProps { - settings: SettingsType; -} - -export const SettingsForm = ({settings}: SettingsFormProps) => { - const { - handleSubmit, - control, - formState: {isDirty}, - reset, - } = useForm({ - defaultValues: settings, - }); - - useEffect(() => { - if (isDirty) { - handleSubmit((data) => { - gStore.set(StorageKey.SETTINGS, data); - reset(data); - })(); - } - }, [isDirty]); - - return ( - - - }> - Market - - - - - - - - ); -}; diff --git a/src/pages/options/settings/SettingsPage.tsx b/src/pages/options/settings/SettingsPage.tsx index 9df56cc7..88dc9fd0 100644 --- a/src/pages/options/settings/SettingsPage.tsx +++ b/src/pages/options/settings/SettingsPage.tsx @@ -1,24 +1,20 @@ -import {Loader} from '@mantine/core'; -import {useEffect, useState} from 'react'; +import {Tabs} from '@mantine/core'; -import {SettingsForm} from './SettingsForm'; -import {DEFAULT_SETTINGS, SettingsType} from '../../../settings'; -import {gStore} from '../../../lib/storage/store'; -import {StorageKey} from '../../../lib/storage/keys'; +import {IconBuildingStore} from '@tabler/icons-react'; +import {MarketSettings} from './MarketSettings'; export const SettingsPage = () => { - const [settings, setSettings] = useState(); + return ( + + + }> + Market + + - useEffect(() => { - gStore - .get(StorageKey.SETTINGS) - .then((settings) => setSettings({...DEFAULT_SETTINGS, ...(settings || {})})) - .catch(() => setSettings(DEFAULT_SETTINGS)); - }, []); - - if (settings === undefined) { - return ; - } - - return ; + + + + + ); }; diff --git a/src/settings.ts b/src/settings.ts index b50b3515..4d131b49 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -1,11 +1,38 @@ -export interface SettingsType { - market: { - '3d-screenshot-buttons': boolean; - }; +import {StorageKey} from './lib/storage/keys'; +import {gStore} from './lib/storage/store'; + +export interface Settings { + '3d-screenshot-buttons': boolean; } -export const DEFAULT_SETTINGS: SettingsType = { - market: { - '3d-screenshot-buttons': true, - }, +export type StoredSettings = Partial; + +export const DEFAULT_SETTINGS: Settings = { + '3d-screenshot-buttons': true, +}; + +export const GetStoredSettings = async () => { + const settings = await gStore.get(StorageKey.SETTINGS); + + if (settings !== null) { + return settings; + } + + await gStore.set(StorageKey.SETTINGS, {}); + + return {}; +}; + +export const GetSetting = async (name: keyof Settings) => { + const settings = await GetStoredSettings(); + + const value = settings[name]; + + return value !== undefined ? value : DEFAULT_SETTINGS[name]; +}; + +export const SetSetting = async (name: T, value: Settings[T]) => { + const settings = await GetStoredSettings(); + + await gStore.set(StorageKey.SETTINGS, {...settings, [name]: value}); }; diff --git a/webpack.config.js b/webpack.config.js index 6d58037b..ace351cf 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -75,6 +75,13 @@ module.exports = (env) => { }, exclude: /node_modules/, }, + // For some reason, we need this in order to use @tanstack/react-query + { + test: /\.m?js$/, + resolve: { + fullySpecified: false, + }, + }, ], }, plugins: [ From 5dce6e8e0073471c220bdbe15f6fcbc48d07671c Mon Sep 17 00:00:00 2001 From: ayoung19 Date: Thu, 3 Aug 2023 01:19:52 -0700 Subject: [PATCH 08/23] Merge --- README.md | 30 ++++- manifest.json | 8 +- package-lock.json | 8 +- package.json | 10 +- src/README.md | 14 +-- src/background_ff.html | 2 +- src/global.css | 14 +-- src/lib/bridge/client.ts | 2 +- src/lib/bridge/handlers/csmoney_price.ts | 35 ------ src/lib/bridge/handlers/execute_script.ts | 4 +- src/lib/bridge/handlers/fetch_inspect_info.ts | 2 +- .../bridge/handlers/fetch_pending_trades.ts | 26 +++- src/lib/bridge/handlers/fetch_stall.ts | 2 +- src/lib/bridge/handlers/handlers.ts | 2 - src/lib/bridge/handlers/types.ts | 1 - src/lib/bridge/types.ts | 2 +- .../components/common/item_holder_metadata.ts | 6 +- src/lib/components/custom.ts | 2 +- src/lib/components/filter/filter_container.ts | 4 +- src/lib/components/filter/filter_creator.ts | 6 +- src/lib/components/filter/filter_help.ts | 2 +- src/lib/components/filter/filter_view.ts | 8 +- .../inventory/selected_item_info.ts | 12 +- src/lib/components/market/ad_banner.ts | 112 ------------------ src/lib/components/market/helpers.ts | 8 +- src/lib/components/market/item_row_wrapper.ts | 2 +- src/lib/components/market/skin_viewer.ts | 10 +- src/lib/components/market/sort_listings.ts | 8 +- src/lib/components/market/utility_belt.ts | 13 +- .../components/trade_history/trade_proof.ts | 6 +- src/lib/components/trade_offer/auto_fill.ts | 69 +++++++++-- src/lib/page_scripts/utils.ts | 12 +- src/lib/types/extension_globals.ts | 4 +- src/lib/types/float_market.ts | 2 +- src/lib/types/steam.d.ts | 2 +- src/lib/utils/key.ts | 2 +- src/lib/utils/skin.ts | 2 +- webpack.config.js | 2 +- 38 files changed, 195 insertions(+), 261 deletions(-) delete mode 100644 src/lib/bridge/handlers/csmoney_price.ts delete mode 100644 src/lib/components/market/ad_banner.ts diff --git a/README.md b/README.md index 40749788..402db240 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@

- - + +

-[![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/Step7750/CSGOFloat/LICENSE) -[![Website](https://img.shields.io/website-up-down-green-red/https/csgofloat.com.svg)](https://csgofloat.com) +[![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/csfloat/extension/LICENSE) +[![Website](https://img.shields.io/website-up-down-green-red/https/csfloat.com.svg)](https://csfloat.com) [![Chrome Web Store](https://img.shields.io/chrome-web-store/d/jjicbefpemnphinccgikpdaagjebbnhg.svg)](https://chrome.google.com/webstore/detail/csgofloat-market-checker/jjicbefpemnphinccgikpdaagjebbnhg) [![Chrome Web Store](https://img.shields.io/chrome-web-store/stars/jjicbefpemnphinccgikpdaagjebbnhg.svg)](https://chrome.google.com/webstore/detail/csgofloat-market-checker/jjicbefpemnphinccgikpdaagjebbnhg) [![Chrome Web Store](https://img.shields.io/chrome-web-store/rating-count/jjicbefpemnphinccgikpdaagjebbnhg.svg)](https://chrome.google.com/webstore/detail/csgofloat-market-checker/jjicbefpemnphinccgikpdaagjebbnhg) @@ -34,6 +34,26 @@ CSGOFloat has an extension for Firefox/Chrome that lets you fetch floats directl Please see [`src/`](/src/README.md) for an overview of how the extension works and underlying tech. Contributions are welcome! +### How to Build (Release) + +> `npm install` +> +> `npm run build` + +The resultant build will be in the `dist/` directory. + +Note: You can also use `npm run build_ff` for Firefox + +### How to Build (Development) + +> `npm install` +> +> `npm run start` + +Load the `dist/` directory as a temporary extension in Chrome. Code changes will automatically trigger a re-build. + +Note: You can also use `npm run start_ff` for Firefox + ## Changelog -See [Releases](https://github.com/csgofloat/extension/releases) for release notes. +See [Releases](https://github.com/csfloat/extension/releases) for release notes. diff --git a/manifest.json b/manifest.json index 62ed5a40..c5fd5b3f 100644 --- a/manifest.json +++ b/manifest.json @@ -1,9 +1,9 @@ { "manifest_version": 3, - "name": "CSGOFloat Market Checker", - "short_name": "CSGOFloat", - "version": "3.1.0", - "description": "Dedicated API for fetching the float value, paint seed, and screenshots of CS:GO items on the Steam Market or Inventories", + "name": "CSFloat Market Checker", + "short_name": "CSFloat", + "version": "3.2.0", + "description": "Shows the float value, paint seed, and screenshots of Counter-Strike (CS:GO & CS2) items on the Steam Market or Inventories", "icons": { "16": "icons/16.png", "48": "icons/48.png", diff --git a/package-lock.json b/package-lock.json index e9754b54..c14417e3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { - "name": "csgofloat-extension", - "version": "3.1.0", + "name": "csfloat-extension", + "version": "3.2.0", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "csgofloat-extension", - "version": "3.1.0", + "name": "csfloat-extension", + "version": "3.2.0", "license": "MIT", "dependencies": { "@emotion/react": "^11.11.1", diff --git a/package.json b/package.json index c8270aff..bb90c156 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { - "name": "csgofloat-extension", - "version": "3.1.0", + "name": "csfloat-extension", + "version": "3.2.0", "description": "Dedicated API for fetching the float value, paint seed, and screenshots of CS:GO items on the Steam Market or Inventories", "main": ".eslintrc", "directories": { @@ -8,7 +8,7 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/csgofloat/extension.git" + "url": "git+https://github.com/csfloat/extension.git" }, "scripts": { "build": "webpack --env mode=prod browser=chrome --config webpack.config.js --stats-error-details", @@ -22,9 +22,9 @@ "author": "step7750", "license": "MIT", "bugs": { - "url": "https://github.com/csgofloat/extension/issues" + "url": "https://github.com/csfloat/extension/issues" }, - "homepage": "https://github.com/csgofloat/extension#readme", + "homepage": "https://github.com/csfloat/extension#readme", "devDependencies": { "@types/chrome": "^0.0.193", "@types/firefox-webext-browser": "^111.0.1", diff --git a/src/README.md b/src/README.md index ad6500f5..b5071852 100644 --- a/src/README.md +++ b/src/README.md @@ -33,7 +33,7 @@ Typically, only being able to access the DOM (ie. HTML env) of the page is not e changes to the page for your extension. Historically, many extensions would use on-demand script injection into the page in order to retrieve a variable, -call a function, or mutate page-JS state. This is what our extension [used to do](https://github.com/csgofloat/extension/blob/ca85d56e3b268330537daf6bc6be7837213cc7a4/lib/bridge.js) +call a function, or mutate page-JS state. This is what our extension [used to do](https://github.com/csfloat/extension/blob/ca85d56e3b268330537daf6bc6be7837213cc7a4/lib/bridge.js) and what others like CSGO-Trader [currently do](https://github.com/gergelyszabo94/csgo-trader-extension/blob/216df0e4eb6c481c893426d2324b93da026e92d3/extension/src/utils/injection.js#L4) (as of 2022/10/01). Pros @@ -50,13 +50,13 @@ Cons Since Steam's Content Security Policy restrictions are applied to the content script's AJAX requests, typically event messaging to the background script is done. The background script is not restricted and will perform the request for us and send back the result. -This is the mechanism you'd need to use whenever you fetch an HTTPS resource (like `https://api.csgofloat.com`). +This is the mechanism you'd need to use whenever you fetch an HTTPS resource (like `https://api.csfloat.com`). A naiive example would be: `content_script.js` ```javascript -chrome.runtime.sendMessage({type1: 'https://api.csgofloat.com/?url=steam://....'}, (response) => { +chrome.runtime.sendMessage({type1: 'https://api.csfloat.com/?url=steam://....'}, (response) => { // do something }); ``` @@ -81,11 +81,11 @@ Cons * Type-checking is _hard_, easy to lose context of what you expect a request to return -### How CSGOFloat's Extension Works +### How CSFloat's Extension Works #### Accessing the Page's JS runtime -Almost the entirety of CSGOFloat's Extension runs within the page context and **not** the content script. +Almost the entirety of CSFloat's Extension runs within the page context and **not** the content script. This allows us to easily access page globals, call Steam's functions, override their functions. Additionally, this gives a clear consistent environment to think about as a developer. @@ -99,7 +99,7 @@ script. This effectively tells Chrome to re-run the script, but in the page inst Now that our scripts run within the page, we still want to be able to make AJAX requests to other domains outside of Steam's Content Security Policy. -CSGOFloat's Extension similarly uses the mechanism of making the actual request in a background script, but +CSFloat's Extension similarly uses the mechanism of making the actual request in a background script, but creates an abstraction layer on top. Dubbed the "bridge", it allows for **type safe** request and response handling between the page and background script. @@ -117,7 +117,7 @@ You can find more details in `/bridge`. When try to mutate a page, you also want the ability to create new UI components, potentially _reusing_ the styling on the page. For example, you'd create a component that shows the float for a given item. -CSGOFloat's Extension uses Web Components via the library [Lit](https://lit.dev/). Each UI mutation is a separate +CSFloat's Extension uses Web Components via the library [Lit](https://lit.dev/). Each UI mutation is a separate component that has its own state management and rendering logic. You can find our components in `/components`. diff --git a/src/background_ff.html b/src/background_ff.html index fbc3d624..a4f7f7c0 100644 --- a/src/background_ff.html +++ b/src/background_ff.html @@ -5,7 +5,7 @@ - CSGOFloat Background + CSFloat Background diff --git a/src/global.css b/src/global.css index aa078347..c43d5550 100644 --- a/src/global.css +++ b/src/global.css @@ -1,8 +1,8 @@ -.csgofloat-stickers-container { +.csfloat-stickers-container { float: right; } -.csgofloat-easy-inspect { +.csfloat-easy-inspect { position: absolute; height: 74px; width: 74px; @@ -15,18 +15,18 @@ font-size: 20px; } -.market_recent_listing_row:hover .csgofloat-easy-inspect { +.market_recent_listing_row:hover .csfloat-easy-inspect { display: initial; } /* Powers animation for shining float boxes */ -.csgofloat-shine { +.csfloat-shine { overflow: hidden; } /* Based on https://jsfiddle.net/AntonTrollback/nqQc7/ */ -.csgofloat-shine:after { - animation: csgofloat-shine-frames 4s ease-in-out infinite; +.csfloat-shine:after { + animation: csfloat-shine-frames 4s ease-in-out infinite; content: ''; position: absolute; top: -110%; @@ -46,7 +46,7 @@ ); } -@keyframes csgofloat-shine-frames { +@keyframes csfloat-shine-frames { 50% { opacity: 1; top: -30%; diff --git a/src/lib/bridge/client.ts b/src/lib/bridge/client.ts index 305d6363..d3287e01 100644 --- a/src/lib/bridge/client.ts +++ b/src/lib/bridge/client.ts @@ -25,7 +25,7 @@ export async function ClientSend(handler: RequestHandler, return new Promise((resolve, reject) => { // @ts-ignore Bad types runtimeNamespace().runtime.sendMessage( - window.CSGOFLOAT_EXTENSION_ID || chrome.runtime.id, + window.CSFLOAT_EXTENSION_ID || chrome.runtime.id, bundle, // @ts-ignore Bad types (resp: InternalResponseBundle) => { diff --git a/src/lib/bridge/handlers/csmoney_price.ts b/src/lib/bridge/handlers/csmoney_price.ts deleted file mode 100644 index fc2a0372..00000000 --- a/src/lib/bridge/handlers/csmoney_price.ts +++ /dev/null @@ -1,35 +0,0 @@ -import {SimpleHandler} from './main'; -import {RequestType} from './types'; - -export interface CSMoneyPriceRequest { - marketHashName: string; -} - -interface DynamicBanner { - dynamic: boolean; - link: string; - src: string; - height: string; -} - -interface ImageBanner { - link: string; - src: string; - height: string; -} - -interface Banner extends DynamicBanner, ImageBanner {} - -export interface CSMoneyPriceResponse { - price: number; - banner?: {enable?: boolean} & Banner; -} - -export const CSMoneyPrice = new SimpleHandler( - RequestType.CSMONEY_PRICE, - async (req, sender) => { - return fetch(`https://money.csgofloat.com/price?name=${req.marketHashName}`).then((resp) => { - return resp.json() as Promise; - }); - } -); diff --git a/src/lib/bridge/handlers/execute_script.ts b/src/lib/bridge/handlers/execute_script.ts index 0d1a3cce..2d60d880 100644 --- a/src/lib/bridge/handlers/execute_script.ts +++ b/src/lib/bridge/handlers/execute_script.ts @@ -17,8 +17,8 @@ export const ExecuteScriptOnPage = new PrivilegedHandler( world: 'MAIN', args: [chrome.runtime.id, chrome.runtime.getURL('src/model_frame.html')], func: function ExtensionId(extensionId, modelFrameUrl) { - window.CSGOFLOAT_EXTENSION_ID = extensionId; - window.CSGOFLOAT_MODEL_FRAME_URL = modelFrameUrl; + window.CSFLOAT_EXTENSION_ID = extensionId; + window.CSFLOAT_MODEL_FRAME_URL = modelFrameUrl; }, }); diff --git a/src/lib/bridge/handlers/fetch_inspect_info.ts b/src/lib/bridge/handlers/fetch_inspect_info.ts index 986d7f35..63dc1699 100644 --- a/src/lib/bridge/handlers/fetch_inspect_info.ts +++ b/src/lib/bridge/handlers/fetch_inspect_info.ts @@ -52,7 +52,7 @@ export interface FetchInspectInfoResponse { export const FetchInspectInfo = new SimpleHandler( RequestType.FETCH_INSPECT_INFO, (req) => { - const apiUrl = `https://api.csgofloat.com/?url=${req.link}&minimal=true${ + const apiUrl = `https://api.csfloat.com/?url=${req.link}&minimal=true${ req.listPrice ? '&listPrice=' + req.listPrice : '' }`; return fetch(apiUrl).then((resp) => { diff --git a/src/lib/bridge/handlers/fetch_pending_trades.ts b/src/lib/bridge/handlers/fetch_pending_trades.ts index 0b80b953..61f966ef 100644 --- a/src/lib/bridge/handlers/fetch_pending_trades.ts +++ b/src/lib/bridge/handlers/fetch_pending_trades.ts @@ -12,10 +12,28 @@ export interface FetchPendingTradesResponse { export const FetchPendingTrades = new SimpleHandler( RequestType.FETCH_PENDING_TRADES, async (req) => { - return fetch(`https://csgofloat.com/api/v1/me/pending-trades`, { - credentials: 'include', - }).then((resp) => { + try { + const resp = await fetch(`https://csfloat.com/api/v1/me/pending-trades`, { + credentials: 'include', + }); + + if (resp.status !== 200) { + throw new Error('invalid status'); + } + return resp.json() as Promise; - }); + } catch (e) { + // Try the old CSGOFloat URL (in case they have an old session from there) + // Of note, this can be removed ~1 week after the migration. + const resp = await fetch(`https://csgofloat.com/api/v1/me/pending-trades`, { + credentials: 'include', + }); + + if (resp.status !== 200) { + throw new Error('invalid status'); + } + + return resp.json(); + } } ); diff --git a/src/lib/bridge/handlers/fetch_stall.ts b/src/lib/bridge/handlers/fetch_stall.ts index 984f14e1..17490c73 100644 --- a/src/lib/bridge/handlers/fetch_stall.ts +++ b/src/lib/bridge/handlers/fetch_stall.ts @@ -19,7 +19,7 @@ export interface FetchStallResponseError { export const FetchStall = new SimpleHandler( RequestType.FETCH_STALL, async (req) => { - return fetch(`https://csgofloat.com/api/v1/users/${req.steam_id64}/stall`).then((resp) => { + return fetch(`https://csfloat.com/api/v1/users/${req.steam_id64}/stall`).then((resp) => { return resp.json().then((json: FetchStallResponse | FetchStallResponseError) => { if (resp.ok) { return json; diff --git a/src/lib/bridge/handlers/handlers.ts b/src/lib/bridge/handlers/handlers.ts index efd4aab2..916c21a8 100644 --- a/src/lib/bridge/handlers/handlers.ts +++ b/src/lib/bridge/handlers/handlers.ts @@ -4,7 +4,6 @@ import {FetchInspectInfo} from './fetch_inspect_info'; import {ExecuteCssOnPage} from './execute_css'; import {StorageGet} from './storage_get'; import {StorageSet} from './storage_set'; -import {CSMoneyPrice} from './csmoney_price'; import {RequestHandler} from '../types'; import {FetchPendingTrades} from './fetch_pending_trades'; import {FetchSkinModel} from './fetch_skin_model'; @@ -23,7 +22,6 @@ export const HANDLERS_MAP: {[key in RequestType]: RequestHandler} = { [RequestType.STORAGE_GET]: StorageGet, [RequestType.STORAGE_SET]: StorageSet, [RequestType.STORAGE_REMOVE]: StorageRemove, - [RequestType.CSMONEY_PRICE]: CSMoneyPrice, [RequestType.FETCH_PENDING_TRADES]: FetchPendingTrades, [RequestType.FETCH_SKIN_MODEL]: FetchSkinModel, [RequestType.FETCH_EXTENSION_FILE]: FetchExtensionFile, diff --git a/src/lib/bridge/handlers/types.ts b/src/lib/bridge/handlers/types.ts index 67362f27..2ed79891 100644 --- a/src/lib/bridge/handlers/types.ts +++ b/src/lib/bridge/handlers/types.ts @@ -6,7 +6,6 @@ export enum RequestType { STORAGE_GET, STORAGE_SET, STORAGE_REMOVE, - CSMONEY_PRICE, FETCH_PENDING_TRADES, FETCH_SKIN_MODEL, FETCH_EXTENSION_FILE, diff --git a/src/lib/bridge/types.ts b/src/lib/bridge/types.ts index bf56f8bc..e4709906 100644 --- a/src/lib/bridge/types.ts +++ b/src/lib/bridge/types.ts @@ -7,7 +7,7 @@ export interface RequestHandler { } export enum Version { - V1 = 'CSGOFLOAT_V1', + V1 = 'CSFLOAT_V1', } export interface InternalRequestBundle { diff --git a/src/lib/components/common/item_holder_metadata.ts b/src/lib/components/common/item_holder_metadata.ts index 8b6d0cd9..37ee35ea 100644 --- a/src/lib/components/common/item_holder_metadata.ts +++ b/src/lib/components/common/item_holder_metadata.ts @@ -35,7 +35,7 @@ export abstract class ItemHolderMetadata extends FloatElement { -webkit-text-fill-color: transparent; } - .csgofloat-shine-fade-text { + .csfloat-shine-fade-text { font-weight: 1000; -webkit-text-stroke: 1px black; } @@ -83,7 +83,7 @@ export abstract class ItemHolderMetadata extends FloatElement { ${formatSeed(this.itemInfo)} ${fadePercentage !== undefined - ? html`(${floor(fadePercentage, 1)}%)` : nothing} { return html`
- +
`; })} - + `; } diff --git a/src/lib/components/filter/filter_creator.ts b/src/lib/components/filter/filter_creator.ts index 456fd85d..17abe5ea 100644 --- a/src/lib/components/filter/filter_creator.ts +++ b/src/lib/components/filter/filter_creator.ts @@ -90,14 +90,14 @@ export class FilterCreator extends FloatElement { > ${this.error ? 'X' : '✓'}
- + >
${(this.expression && this.error) || nothing}
- + `; } diff --git a/src/lib/components/filter/filter_help.ts b/src/lib/components/filter/filter_help.ts index f806f255..ad1287d4 100644 --- a/src/lib/components/filter/filter_help.ts +++ b/src/lib/components/filter/filter_help.ts @@ -11,7 +11,7 @@ export class FilterHelp extends FloatElement { Note: If multiple filters match an item, it will be highlighted with the average colour

- New: You can now filter based on FloatDB ranks and item price!

+ New: You can now filter based on FloatDB ranks and item price!

Examples: