diff --git a/web/package-lock.json b/web/package-lock.json index 5325b252..c0780a4f 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -6,22 +6,23 @@ "": { "name": "mantic", "dependencies": { - "@headlessui/react": "^1.4.2", - "@heroicons/react": "^1.0.5", + "@headlessui/react": "1.4.2", + "@heroicons/react": "1.0.5", + "daisyui": "^1.16.2", "next": "12.0.4", "react": "17.0.2", "react-dom": "17.0.2" }, "devDependencies": { - "@tailwindcss/forms": "^0.3.4", + "@tailwindcss/forms": "0.3.4", "@types/node": "16.11.11", "@types/react": "17.0.37", - "autoprefixer": "^10.2.6", + "autoprefixer": "10.2.6", "eslint": "7.32.0", "eslint-config-next": "12.0.4", - "postcss": "^8.3.5", + "postcss": "8.3.5", "prettier": "2.5.0", - "tailwindcss": "^2.2.4", + "tailwindcss": "2.2.4", "typescript": "4.5.2" } }, @@ -778,6 +779,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@fullhuman/postcss-purgecss": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@fullhuman/postcss-purgecss/-/postcss-purgecss-4.1.3.tgz", + "integrity": "sha512-jqcsyfvq09VOsMXxJMPLRF6Fhg/NNltzWKnC9qtzva+QKTxerCO4esG6je7hbnmkpZtaDyPTwMBj9bzfWorsrw==", + "dev": true, + "dependencies": { + "purgecss": "^4.1.3" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, "node_modules/@hapi/accept": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/@hapi/accept/-/accept-5.0.2.tgz", @@ -1659,16 +1672,16 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.0.tgz", - "integrity": "sha512-7FdJ1ONtwzV1G43GDD0kpVMn/qbiNqyOPMFTX5nRffI+7vgWoFEc6DcXOxHJxrWNDXrZh18eDsZjvZGUljSRGA==", + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.2.6.tgz", + "integrity": "sha512-8lChSmdU6dCNMCQopIf4Pe5kipkAGj/fvTMslCsih0uHpOrXOPUEVOmYMMqmw3cekQkSD7EhIeuYl5y0BLdKqg==", "dev": true, "dependencies": { - "browserslist": "^4.17.5", - "caniuse-lite": "^1.0.30001272", + "browserslist": "^4.16.6", + "caniuse-lite": "^1.0.30001230", + "colorette": "^1.2.2", "fraction.js": "^4.1.1", "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", "postcss-value-parser": "^4.1.0" }, "bin": { @@ -2015,13 +2028,13 @@ "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" }, "node_modules/color": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/color/-/color-4.0.2.tgz", - "integrity": "sha512-fSu0jW2aKQG2FHlDywqdFPdabJHsUdZ0xabSt3wFZdcgRKtLnUHs19nUtuFuLGVMFhINGgfZEIjbUOsGZXGu7Q==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", "dev": true, "dependencies": { - "color-convert": "^2.0.1", - "color-string": "^1.7.4" + "color-convert": "^1.9.3", + "color-string": "^1.6.0" } }, "node_modules/color-convert": { @@ -2038,33 +2051,15 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "node_modules/color-string": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.8.2.tgz", - "integrity": "sha512-w5ZkKRdLsc5NOYsmnpS2DpyRW71npwZGwbRpLrJTuqjfTs2Bhrba7UiV59IX9siBlCPl2pne5NtiwnVWUzvYFA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.0.tgz", + "integrity": "sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ==", "dev": true, "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, - "node_modules/color/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/colorette": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", @@ -2209,15 +2204,6 @@ "node": "*" } }, - "node_modules/css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/css-unit-converter": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.2.tgz", @@ -2274,6 +2260,11 @@ "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==", "dev": true }, + "node_modules/daisyui": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-1.16.2.tgz", + "integrity": "sha512-kHoTvq3/eU8tPbu3U3Nwq7yy0I5zauqAYRSvw1x+t8g9FBjFm3jNtUQO/vBjUZsU7ABIf5aaT58iBF2NeusCUA==" + }, "node_modules/damerau-levenshtein": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz", @@ -3652,12 +3643,6 @@ "he": "bin/he" } }, - "node_modules/hex-color-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", - "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", - "dev": true - }, "node_modules/hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -3668,18 +3653,6 @@ "minimalistic-crypto-utils": "^1.0.1" } }, - "node_modules/hsl-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", - "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", - "dev": true - }, - "node_modules/hsla-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", - "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", - "dev": true - }, "node_modules/html-tags": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", @@ -3917,20 +3890,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-color-stop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", - "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", - "dev": true, - "dependencies": { - "css-color-names": "^0.0.4", - "hex-color-regex": "^1.1.0", - "hsl-regex": "^1.0.0", - "hsla-regex": "^1.0.0", - "rgb-regex": "^1.0.1", - "rgba-regex": "^1.0.0" - } - }, "node_modules/is-core-module": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", @@ -5034,13 +4993,13 @@ "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" }, "node_modules/postcss": { - "version": "8.4.4", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.4.tgz", - "integrity": "sha512-joU6fBsN6EIer28Lj6GDFoC/5yOZzLCfn0zHAn/MYXI7aPt4m4hK5KC5ovEZXy+lnCjmYIbQWngvju2ddyEr8Q==", + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.5.tgz", + "integrity": "sha512-NxTuJocUhYGsMiMFHDUkmjSKT3EdH4/WbGF6GCi1NDGk+vbcUTun4fpbOqaPtD8IIsztA2ilZm2DhYCuyN58gA==", "dependencies": { - "nanoid": "^3.1.30", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.1" + "colorette": "^1.2.2", + "nanoid": "^3.1.23", + "source-map-js": "^0.6.2" }, "engines": { "node": "^10 || ^12 || >=14" @@ -5094,22 +5053,22 @@ } }, "node_modules/postcss-nested": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", - "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.5.tgz", + "integrity": "sha512-GSRXYz5bccobpTzLQZXOnSOfKl6TwVr5CyAQJUPub4nuRJSOECK5AqurxVgmtxP48p0Kc/ndY/YyS1yqldX0Ew==", "dev": true, "dependencies": { - "postcss-selector-parser": "^6.0.6" + "postcss-selector-parser": "^6.0.4" }, "engines": { - "node": ">=12.0" + "node": ">=10.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/postcss/" }, "peerDependencies": { - "postcss": "^8.2.14" + "postcss": "^8.1.13" } }, "node_modules/postcss-selector-parser": { @@ -5478,18 +5437,6 @@ "node": ">=0.10.0" } }, - "node_modules/rgb-regex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", - "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", - "dev": true - }, - "node_modules/rgba-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", - "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", - "dev": true - }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -5725,9 +5672,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz", - "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", + "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", "engines": { "node": ">=0.10.0" } @@ -5990,39 +5937,38 @@ "dev": true }, "node_modules/tailwindcss": { - "version": "2.2.19", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-2.2.19.tgz", - "integrity": "sha512-6Ui7JSVtXadtTUo2NtkBBacobzWiQYVjYW0ZnKaP9S1ZCKQ0w7KVNz+YSDI/j7O7KCMHbOkz94ZMQhbT9pOqjw==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-2.2.4.tgz", + "integrity": "sha512-OdBCPgazNNsknSP+JfrPzkay9aqKjhKtFhbhgxHgvEFdHy/GuRPo2SCJ4w1SFTN8H6FPI4m6qD/Jj20NWY1GkA==", "dev": true, "dependencies": { - "arg": "^5.0.1", + "@fullhuman/postcss-purgecss": "^4.0.3", + "arg": "^5.0.0", "bytes": "^3.0.0", - "chalk": "^4.1.2", + "chalk": "^4.1.1", "chokidar": "^3.5.2", - "color": "^4.0.1", - "cosmiconfig": "^7.0.1", + "color": "^3.1.3", + "cosmiconfig": "^7.0.0", "detective": "^5.2.0", - "didyoumean": "^1.2.2", + "didyoumean": "^1.2.1", "dlv": "^1.1.3", - "fast-glob": "^3.2.7", + "fast-glob": "^3.2.5", "fs-extra": "^10.0.0", - "glob-parent": "^6.0.1", + "glob-parent": "^6.0.0", "html-tags": "^3.1.0", - "is-color-stop": "^1.1.0", "is-glob": "^4.0.1", "lodash": "^4.17.21", "lodash.topath": "^4.5.2", "modern-normalize": "^1.1.0", - "node-emoji": "^1.11.0", + "node-emoji": "^1.8.1", "normalize-path": "^3.0.0", "object-hash": "^2.2.0", "postcss-js": "^3.0.3", "postcss-load-config": "^3.1.0", - "postcss-nested": "5.0.6", + "postcss-nested": "5.0.5", "postcss-selector-parser": "^6.0.6", "postcss-value-parser": "^4.1.0", "pretty-hrtime": "^1.0.3", - "purgecss": "^4.0.3", "quick-lru": "^5.1.1", "reduce-css-calc": "^2.1.8", "resolve": "^1.20.0", @@ -7108,6 +7054,15 @@ } } }, + "@fullhuman/postcss-purgecss": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/@fullhuman/postcss-purgecss/-/postcss-purgecss-4.1.3.tgz", + "integrity": "sha512-jqcsyfvq09VOsMXxJMPLRF6Fhg/NNltzWKnC9qtzva+QKTxerCO4esG6je7hbnmkpZtaDyPTwMBj9bzfWorsrw==", + "dev": true, + "requires": { + "purgecss": "^4.1.3" + } + }, "@hapi/accept": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/@hapi/accept/-/accept-5.0.2.tgz", @@ -7702,16 +7657,16 @@ "dev": true }, "autoprefixer": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.0.tgz", - "integrity": "sha512-7FdJ1ONtwzV1G43GDD0kpVMn/qbiNqyOPMFTX5nRffI+7vgWoFEc6DcXOxHJxrWNDXrZh18eDsZjvZGUljSRGA==", + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.2.6.tgz", + "integrity": "sha512-8lChSmdU6dCNMCQopIf4Pe5kipkAGj/fvTMslCsih0uHpOrXOPUEVOmYMMqmw3cekQkSD7EhIeuYl5y0BLdKqg==", "dev": true, "requires": { - "browserslist": "^4.17.5", - "caniuse-lite": "^1.0.30001272", + "browserslist": "^4.16.6", + "caniuse-lite": "^1.0.30001230", + "colorette": "^1.2.2", "fraction.js": "^4.1.1", "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", "postcss-value-parser": "^4.1.0" }, "dependencies": { @@ -7971,30 +7926,13 @@ "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" }, "color": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/color/-/color-4.0.2.tgz", - "integrity": "sha512-fSu0jW2aKQG2FHlDywqdFPdabJHsUdZ0xabSt3wFZdcgRKtLnUHs19nUtuFuLGVMFhINGgfZEIjbUOsGZXGu7Q==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", "dev": true, "requires": { - "color-convert": "^2.0.1", - "color-string": "^1.7.4" - }, - "dependencies": { - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - } + "color-convert": "^1.9.3", + "color-string": "^1.6.0" } }, "color-convert": { @@ -8011,9 +7949,9 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "color-string": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.8.2.tgz", - "integrity": "sha512-w5ZkKRdLsc5NOYsmnpS2DpyRW71npwZGwbRpLrJTuqjfTs2Bhrba7UiV59IX9siBlCPl2pne5NtiwnVWUzvYFA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.0.tgz", + "integrity": "sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ==", "dev": true, "requires": { "color-name": "^1.0.0", @@ -8151,12 +8089,6 @@ "randomfill": "^1.0.3" } }, - "css-color-names": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", - "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", - "dev": true - }, "css-unit-converter": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.2.tgz", @@ -8196,6 +8128,11 @@ "integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==", "dev": true }, + "daisyui": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-1.16.2.tgz", + "integrity": "sha512-kHoTvq3/eU8tPbu3U3Nwq7yy0I5zauqAYRSvw1x+t8g9FBjFm3jNtUQO/vBjUZsU7ABIf5aaT58iBF2NeusCUA==" + }, "damerau-levenshtein": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz", @@ -9250,12 +9187,6 @@ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" }, - "hex-color-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", - "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", - "dev": true - }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -9266,18 +9197,6 @@ "minimalistic-crypto-utils": "^1.0.1" } }, - "hsl-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", - "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", - "dev": true - }, - "hsla-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", - "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", - "dev": true - }, "html-tags": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", @@ -9440,20 +9359,6 @@ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==" }, - "is-color-stop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", - "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", - "dev": true, - "requires": { - "css-color-names": "^0.0.4", - "hex-color-regex": "^1.1.0", - "hsl-regex": "^1.0.0", - "hsla-regex": "^1.0.0", - "rgb-regex": "^1.0.1", - "rgba-regex": "^1.0.0" - } - }, "is-core-module": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", @@ -10265,13 +10170,13 @@ "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" }, "postcss": { - "version": "8.4.4", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.4.tgz", - "integrity": "sha512-joU6fBsN6EIer28Lj6GDFoC/5yOZzLCfn0zHAn/MYXI7aPt4m4hK5KC5ovEZXy+lnCjmYIbQWngvju2ddyEr8Q==", + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.5.tgz", + "integrity": "sha512-NxTuJocUhYGsMiMFHDUkmjSKT3EdH4/WbGF6GCi1NDGk+vbcUTun4fpbOqaPtD8IIsztA2ilZm2DhYCuyN58gA==", "requires": { - "nanoid": "^3.1.30", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.1" + "colorette": "^1.2.2", + "nanoid": "^3.1.23", + "source-map-js": "^0.6.2" } }, "postcss-js": { @@ -10296,12 +10201,12 @@ } }, "postcss-nested": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", - "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.5.tgz", + "integrity": "sha512-GSRXYz5bccobpTzLQZXOnSOfKl6TwVr5CyAQJUPub4nuRJSOECK5AqurxVgmtxP48p0Kc/ndY/YyS1yqldX0Ew==", "dev": true, "requires": { - "postcss-selector-parser": "^6.0.6" + "postcss-selector-parser": "^6.0.4" } }, "postcss-selector-parser": { @@ -10582,18 +10487,6 @@ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true }, - "rgb-regex": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", - "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", - "dev": true - }, - "rgba-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", - "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", - "dev": true - }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -10763,9 +10656,9 @@ } }, "source-map-js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz", - "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==" + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", + "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==" }, "sprintf-js": { "version": "1.0.3", @@ -10975,39 +10868,38 @@ } }, "tailwindcss": { - "version": "2.2.19", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-2.2.19.tgz", - "integrity": "sha512-6Ui7JSVtXadtTUo2NtkBBacobzWiQYVjYW0ZnKaP9S1ZCKQ0w7KVNz+YSDI/j7O7KCMHbOkz94ZMQhbT9pOqjw==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-2.2.4.tgz", + "integrity": "sha512-OdBCPgazNNsknSP+JfrPzkay9aqKjhKtFhbhgxHgvEFdHy/GuRPo2SCJ4w1SFTN8H6FPI4m6qD/Jj20NWY1GkA==", "dev": true, "requires": { - "arg": "^5.0.1", + "@fullhuman/postcss-purgecss": "^4.0.3", + "arg": "^5.0.0", "bytes": "^3.0.0", - "chalk": "^4.1.2", + "chalk": "^4.1.1", "chokidar": "^3.5.2", - "color": "^4.0.1", - "cosmiconfig": "^7.0.1", + "color": "^3.1.3", + "cosmiconfig": "^7.0.0", "detective": "^5.2.0", - "didyoumean": "^1.2.2", + "didyoumean": "^1.2.1", "dlv": "^1.1.3", - "fast-glob": "^3.2.7", + "fast-glob": "^3.2.5", "fs-extra": "^10.0.0", - "glob-parent": "^6.0.1", + "glob-parent": "^6.0.0", "html-tags": "^3.1.0", - "is-color-stop": "^1.1.0", "is-glob": "^4.0.1", "lodash": "^4.17.21", "lodash.topath": "^4.5.2", "modern-normalize": "^1.1.0", - "node-emoji": "^1.11.0", + "node-emoji": "^1.8.1", "normalize-path": "^3.0.0", "object-hash": "^2.2.0", "postcss-js": "^3.0.3", "postcss-load-config": "^3.1.0", - "postcss-nested": "5.0.6", + "postcss-nested": "5.0.5", "postcss-selector-parser": "^6.0.6", "postcss-value-parser": "^4.1.0", "pretty-hrtime": "^1.0.3", - "purgecss": "^4.0.3", "quick-lru": "^5.1.1", "reduce-css-calc": "^2.1.8", "resolve": "^1.20.0", diff --git a/web/package.json b/web/package.json index 1dd9b2ee..293eb098 100644 --- a/web/package.json +++ b/web/package.json @@ -11,6 +11,7 @@ "dependencies": { "@headlessui/react": "1.4.2", "@heroicons/react": "1.0.5", + "daisyui": "^1.16.2", "next": "12.0.4", "react": "17.0.2", "react-dom": "17.0.2" diff --git a/web/pages/simulator/entries.ts b/web/pages/simulator/entries.ts new file mode 100644 index 00000000..6f9103bf --- /dev/null +++ b/web/pages/simulator/entries.ts @@ -0,0 +1,60 @@ +type Bid = { yesBid: number; noBid: number } + +// An entry has a yes/no for bid, weight, payout, return. Also a current probability +export type Entry = { + yesBid: number + noBid: number + yesWeight: number + noWeight: number + yesPayout: number + noPayout: number + yesReturn: number + noReturn: number + prob: number +} + +export function makeEntries(bids: Bid[]): Entry[] { + const entries: Entry[] = [] + let yesPot = 0 + let noPot = 0 + // First pass: calculate all the weights + for (const { yesBid, noBid } of bids) { + const yesWeight = + noPot * (Math.log(yesBid + yesPot) - Math.log(yesPot)) || 0 + const noWeight = yesPot * (Math.log(noBid + noPot) - Math.log(noPot)) || 0 + + // Note: Need to calculate weights BEFORE updating pot + yesPot += yesBid + noPot += noBid + const prob = yesPot / (yesPot + noPot) + + entries.push({ + yesBid, + noBid, + yesWeight, + noWeight, + prob, + // To be filled in below + yesPayout: 0, + noPayout: 0, + yesReturn: 0, + noReturn: 0, + }) + } + + const YES_SEED = bids[0].yesBid + const NO_SEED = bids[0].noBid + const yesWeightsSum = entries.reduce((sum, entry) => sum + entry.yesWeight, 0) + const noWeightsSum = entries.reduce((sum, entry) => sum + entry.noWeight, 0) + // Second pass: calculate all the payouts + for (const entry of entries) { + const { yesBid, noBid, yesWeight, noWeight } = entry + // Payout: You get your initial bid back, as well as your share of the + // (noPot - seed) according to your yesWeight + entry.yesPayout = yesBid + (yesWeight / yesWeightsSum) * (noPot - NO_SEED) + entry.noPayout = noBid + (noWeight / noWeightsSum) * (yesPot - YES_SEED) + entry.yesReturn = (entry.yesPayout - yesBid) / yesBid + entry.noReturn = (entry.noPayout - noBid) / noBid + } + return entries +} diff --git a/web/pages/simulator/index.tsx b/web/pages/simulator/index.tsx new file mode 100644 index 00000000..ddd65419 --- /dev/null +++ b/web/pages/simulator/index.tsx @@ -0,0 +1,135 @@ +import React, { Fragment, useState } from 'react' + +import { bids } from './sample-bids' +import { Entry, makeEntries } from './entries' + +function toTable(entries: Entry[]) { + return entries.map((entry, i) => { + return ( + + {i + 1} + {toRowStart(entry)} + {toRowEnd(entry)} + + ) + }) +} + +function toRowStart(entry: Entry) { + if (entry.yesBid && entry.noBid) { + return ( + + +
SEED
+ + + {entry.yesBid} / {entry.noBid} + +
+ ) + } else if (entry.yesBid) { + return ( + + +
YES
+ + {entry.yesBid} +
+ ) + } else if (entry.noBid) { + return ( + + +
NO
+ + {entry.noBid} +
+ ) + } +} + +function toRowEnd(entry: Entry) { + if (!entry.yesBid && !entry.noBid) { + return ( + + N/A + N/A + N/A + N/A + + ) + } else if (entry.yesBid && entry.noBid) { + return ( + + N/A + {entry.prob.toFixed(2)} + N/A + N/A + + ) + } else if (entry.yesBid) { + return ( + + {entry.yesWeight.toFixed(2)} + {entry.prob.toFixed(2)} + {entry.yesPayout.toFixed(2)} + {(entry.yesReturn * 100).toFixed(2)}% + + ) + } else { + return ( + + {entry.noWeight.toFixed(2)} + {entry.prob.toFixed(2)} + {entry.noPayout.toFixed(2)} + {(entry.noReturn * 100).toFixed(2)}% + + ) + } +} + +// Show a hello world React page +export default function Simulator() { + const [steps, setSteps] = useState(10) + + const entries = makeEntries(bids.slice(0, steps)) + + return ( +
+
+
+

+ Dynamic Parimutuel Market Simulator +

+ {/* Range slider that sets the current step */} + + setSteps(parseInt(e.target.value))} + /> + +
+ + + + + + + + + + + + + {toTable(entries)} +
Order #TypeBidWeightProdMax PayoutReturn
+
+
+
+
+ ) +} diff --git a/web/pages/simulator/sample-bids.ts b/web/pages/simulator/sample-bids.ts new file mode 100644 index 00000000..547e6dce --- /dev/null +++ b/web/pages/simulator/sample-bids.ts @@ -0,0 +1,58 @@ +const data = `1,9 +8, +,1 +1, +,1 +1, +,5 +5, +,5 +5, +,1 +1, +100, +,10 +10, +,10 +10, +,10 +10, +,10 +10, +,10 +10, +,10 +10, +,10 +10, +,10 +10, +,10 +10, +,10 +10, +,10 +10, +,10 +10, +,10 +10, +,10 +10, +,10 +10, +,10 +10, +,10 +10,` + +// Parse data into Yes/No orders +// E.g. `8,\n,1\n1,` => +// [{yesBid: 8, noBid: 0}, {yesBid: 0, noBid: 1}, {yesBid: 1, noBid: 0}] +export const bids = data.split('\n').map((line) => { + const [yesBid, noBid] = line.split(',') + return { + yesBid: parseInt(yesBid || '0'), + noBid: parseInt(noBid || '0'), + } +}) diff --git a/web/tailwind.config.js b/web/tailwind.config.js index 5daa7207..1a2d0073 100644 --- a/web/tailwind.config.js +++ b/web/tailwind.config.js @@ -15,5 +15,5 @@ module.exports = { variants: { extend: {}, }, - plugins: [require('@tailwindcss/forms')], + plugins: [require('@tailwindcss/forms'), require('daisyui')], }