From caf5283a3cddea37fd1a0caabeac876e63f74bdb Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 21 May 2023 22:17:09 +0000 Subject: [PATCH 01/76] chore(deps): update devdependencies-non-major --- package-lock.json | 623 ++++++++++++++++++++++++---------------------- package.json | 14 +- 2 files changed, 330 insertions(+), 307 deletions(-) diff --git a/package-lock.json b/package-lock.json index b4b69c8b..b6d7898a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,15 +28,15 @@ "@testing-library/react": "12.1.5", "@testing-library/user-event": "14.4.3", "@types/node": "17.0.21", - "@types/node-fetch": "2.6.3", - "@types/react": "17.0.58", + "@types/node-fetch": "2.6.4", + "@types/react": "17.0.59", "@types/sanitize-html": "2.9.0", - "@typescript-eslint/eslint-plugin": "5.59.0", - "@typescript-eslint/parser": "5.59.0", + "@typescript-eslint/eslint-plugin": "5.59.6", + "@typescript-eslint/parser": "5.59.6", "autoprefixer": "10.4.14", "babel-plugin-inline-react-svg": "2.0.2", "dotenv": "16.0.3", - "eslint": "8.39.0", + "eslint": "8.41.0", "eslint-config-next": "12.3.4", "eslint-config-prettier": "8.8.0", "eslint-import-resolver-typescript": "2.7.1", @@ -47,10 +47,10 @@ "jest": "28.1.3", "jest-environment-jsdom": "28.1.3", "jest-fetch-mock": "3.0.3", - "node-fetch": "2.6.9", + "node-fetch": "2.6.11", "postcss": "8.4.23", "prettier": "2.8.8", - "tailwindcss": "3.3.1", + "tailwindcss": "3.3.2", "ts-node": "10.9.1", "tsconfig-paths-webpack-plugin": "3.5.2", "typescript": "4.9.5" @@ -62,6 +62,18 @@ "integrity": "sha512-+u76oB43nOHrF4DDWRLWDCtci7f3QJoEBigemIdIeTi1ODqjx6Tad9NCVnPRwewWlKkVab5PlK8DCtPTyX7S8g==", "dev": true }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@ampproject/remapping": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", @@ -623,14 +635,14 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", - "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.1", + "espree": "^9.5.2", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -673,9 +685,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.39.0.tgz", - "integrity": "sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng==", + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.41.0.tgz", + "integrity": "sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -7112,9 +7124,9 @@ "dev": true }, "node_modules/@types/node-fetch": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.3.tgz", - "integrity": "sha512-ETTL1mOEdq/sxUtgtOhKjyB2Irra4cjxksvcMUR5Zr4n+PxVhsCD9WS46oPbHL3et9Zde7CNRr+WUNlcHvsX+w==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.4.tgz", + "integrity": "sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==", "dev": true, "dependencies": { "@types/node": "*", @@ -7157,9 +7169,9 @@ "dev": true }, "node_modules/@types/react": { - "version": "17.0.58", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.58.tgz", - "integrity": "sha512-c1GzVY97P0fGxwGxhYq989j4XwlcHQoto6wQISOC2v6wm3h0PORRWJFHlkRjfGsiG3y1609WdQ+J+tKxvrEd6A==", + "version": "17.0.59", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.59.tgz", + "integrity": "sha512-gSON5zWYIGyoBcycCE75E9+r6dCC2dHdsrVkOEiIYNU5+Q28HcBAuqvDuxHcCbMfHBHdeT5Tva/AFn3rnMKE4g==", "dev": true, "dependencies": { "@types/prop-types": "*", @@ -7272,9 +7284,9 @@ "dev": true }, "node_modules/@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", "dev": true }, "node_modules/@types/stack-utils": { @@ -7314,15 +7326,15 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.0.tgz", - "integrity": "sha512-p0QgrEyrxAWBecR56gyn3wkG15TJdI//eetInP3zYRewDh0XS+DhB3VUAd3QqvziFsfaQIoIuZMxZRB7vXYaYw==", + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.6.tgz", + "integrity": "sha512-sXtOgJNEuRU5RLwPUb1jxtToZbgvq3M6FPpY4QENxoOggK+UpTxUBpj6tD8+Qh2g46Pi9We87E+eHnUw8YcGsw==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.0", - "@typescript-eslint/type-utils": "5.59.0", - "@typescript-eslint/utils": "5.59.0", + "@typescript-eslint/scope-manager": "5.59.6", + "@typescript-eslint/type-utils": "5.59.6", + "@typescript-eslint/utils": "5.59.6", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -7348,9 +7360,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -7363,14 +7375,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.0.tgz", - "integrity": "sha512-qK9TZ70eJtjojSUMrrEwA9ZDQ4N0e/AuoOIgXuNBorXYcBDk397D2r5MIe1B3cok/oCtdNC5j+lUUpVB+Dpb+w==", + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.6.tgz", + "integrity": "sha512-7pCa6al03Pv1yf/dUg/s1pXz/yGMUBAw5EeWqNTFiSueKvRNonze3hma3lhdsOrQcaOXhbk5gKu2Fludiho9VA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.59.0", - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/typescript-estree": "5.59.0", + "@typescript-eslint/scope-manager": "5.59.6", + "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/typescript-estree": "5.59.6", "debug": "^4.3.4" }, "engines": { @@ -7390,13 +7402,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.0.tgz", - "integrity": "sha512-tsoldKaMh7izN6BvkK6zRMINj4Z2d6gGhO2UsI8zGZY3XhLq1DndP3Ycjhi1JwdwPRwtLMW4EFPgpuKhbCGOvQ==", + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.6.tgz", + "integrity": "sha512-gLbY3Le9Dxcb8KdpF0+SJr6EQ+hFGYFl6tVY8VxLPFDfUZC7BHFw+Vq7bM5lE9DwWPfx4vMWWTLGXgpc0mAYyQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/visitor-keys": "5.59.0" + "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/visitor-keys": "5.59.6" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -7407,13 +7419,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.0.tgz", - "integrity": "sha512-d/B6VSWnZwu70kcKQSCqjcXpVH+7ABKH8P1KNn4K7j5PXXuycZTPXF44Nui0TEm6rbWGi8kc78xRgOC4n7xFgA==", + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.6.tgz", + "integrity": "sha512-A4tms2Mp5yNvLDlySF+kAThV9VTBPCvGf0Rp8nl/eoDX9Okun8byTKoj3fJ52IJitjWOk0fKPNQhXEB++eNozQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.59.0", - "@typescript-eslint/utils": "5.59.0", + "@typescript-eslint/typescript-estree": "5.59.6", + "@typescript-eslint/utils": "5.59.6", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -7434,9 +7446,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.0.tgz", - "integrity": "sha512-yR2h1NotF23xFFYKHZs17QJnB51J/s+ud4PYU4MqdZbzeNxpgUr05+dNeCN/bb6raslHvGdd6BFCkVhpPk/ZeA==", + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.6.tgz", + "integrity": "sha512-tH5lBXZI7T2MOUgOWFdVNUILsI02shyQvfzG9EJkoONWugCG77NDDa1EeDGw7oJ5IvsTAAGVV8I3Tk2PNu9QfA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -7447,13 +7459,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.0.tgz", - "integrity": "sha512-sUNnktjmI8DyGzPdZ8dRwW741zopGxltGs/SAPgGL/AAgDpiLsCFLcMNSpbfXfmnNeHmK9h3wGmCkGRGAoUZAg==", + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.6.tgz", + "integrity": "sha512-vW6JP3lMAs/Tq4KjdI/RiHaaJSO7IUsbkz17it/Rl9Q+WkQ77EOuOnlbaU8kKfVIOJxMhnRiBG+olE7f3M16DA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/visitor-keys": "5.59.0", + "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/visitor-keys": "5.59.6", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -7474,9 +7486,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -7489,17 +7501,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.0.tgz", - "integrity": "sha512-GGLFd+86drlHSvPgN/el6dRQNYYGOvRSDVydsUaQluwIW3HvbXuxyuD5JETvBt/9qGYe+lOrDk6gRrWOHb/FvA==", + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.6.tgz", + "integrity": "sha512-vzaaD6EXbTS29cVH0JjXBdzMt6VBlv+hE31XktDRMX1j3462wZCJa7VzO2AxXEXcIl8GQqZPcOPuW/Z1tZVogg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.0", - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/typescript-estree": "5.59.0", + "@typescript-eslint/scope-manager": "5.59.6", + "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/typescript-estree": "5.59.6", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -7515,9 +7527,9 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -7530,12 +7542,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.0.tgz", - "integrity": "sha512-qZ3iXxQhanchCeaExlKPV3gDQFxMUmU35xfd5eCXB6+kUw1TUAbIy2n7QIrwz9s98DQLzNWyHp61fY0da4ZcbA==", + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.6.tgz", + "integrity": "sha512-zEfbFLzB9ETcEJ4HZEEsCR9HHeNku5/Qw1jSS5McYJv5BR+ftYXwFFAH5Al+xkGaZEqowMwl7uoJjQb1YSPF8Q==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/types": "5.59.6", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -9417,15 +9429,15 @@ } }, "node_modules/eslint": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.39.0.tgz", - "integrity": "sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==", + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.41.0.tgz", + "integrity": "sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.2", - "@eslint/js": "8.39.0", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.41.0", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -9436,8 +9448,8 @@ "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.0", - "espree": "^9.5.1", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -9445,13 +9457,12 @@ "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", @@ -9791,9 +9802,9 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", - "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -9928,14 +9939,14 @@ } }, "node_modules/espree": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", - "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", "dev": true, "dependencies": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.0" + "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -10547,6 +10558,12 @@ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, "node_modules/handlebars": { "version": "4.7.7", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", @@ -14103,12 +14120,6 @@ "jiti": "bin/jiti.js" } }, - "node_modules/js-sdsl": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", - "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==", - "dev": true - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -14350,9 +14361,9 @@ } }, "node_modules/lilconfig": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", - "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", "dev": true, "engines": { "node": ">=10" @@ -14966,9 +14977,9 @@ } }, "node_modules/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", "dev": true, "dependencies": { "whatwg-url": "^5.0.0" @@ -18252,9 +18263,9 @@ } }, "node_modules/postcss-import": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", - "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", "dev": true, "dependencies": { "postcss-value-parser": "^4.0.0", @@ -18262,16 +18273,16 @@ "resolve": "^1.1.7" }, "engines": { - "node": ">=10.0.0" + "node": ">=14.0.0" }, "peerDependencies": { "postcss": "^8.0.0" } }, "node_modules/postcss-js": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", - "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", "dev": true, "dependencies": { "camelcase-css": "^2.0.1" @@ -18284,20 +18295,20 @@ "url": "https://opencollective.com/postcss/" }, "peerDependencies": { - "postcss": "^8.3.3" + "postcss": "^8.4.21" } }, "node_modules/postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", "dev": true, "dependencies": { "lilconfig": "^2.0.5", - "yaml": "^1.10.2" + "yaml": "^2.1.1" }, "engines": { - "node": ">= 10" + "node": ">= 14" }, "funding": { "type": "opencollective", @@ -18316,13 +18327,22 @@ } } }, + "node_modules/postcss-load-config/node_modules/yaml": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz", + "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, "node_modules/postcss-nested": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz", - "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", "dev": true, "dependencies": { - "postcss-selector-parser": "^6.0.10" + "postcss-selector-parser": "^6.0.11" }, "engines": { "node": ">=12.0" @@ -18335,6 +18355,19 @@ "postcss": "^8.2.14" } }, + "node_modules/postcss-nested/node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/postcss-selector-parser": { "version": "6.0.10", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", @@ -18847,12 +18880,12 @@ "dev": true }, "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dev": true, "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.11.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -19741,57 +19774,47 @@ "dev": true }, "node_modules/tailwindcss": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.1.tgz", - "integrity": "sha512-Vkiouc41d4CEq0ujXl6oiGFQ7bA3WEhUZdTgXAhtKxSy49OmKs8rEfQmupsfF0IGW8fv2iQkp1EVUuapCFrZ9g==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.2.tgz", + "integrity": "sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==", "dev": true, "dependencies": { + "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", "chokidar": "^3.5.3", - "color-name": "^1.1.4", "didyoumean": "^1.2.2", "dlv": "^1.1.3", "fast-glob": "^3.2.12", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", - "jiti": "^1.17.2", - "lilconfig": "^2.0.6", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.0.0", - "postcss": "^8.0.9", - "postcss-import": "^14.1.0", - "postcss-js": "^4.0.0", - "postcss-load-config": "^3.1.4", - "postcss-nested": "6.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", "postcss-selector-parser": "^6.0.11", "postcss-value-parser": "^4.2.0", - "quick-lru": "^5.1.1", - "resolve": "^1.22.1", - "sucrase": "^3.29.0" + "resolve": "^1.22.2", + "sucrase": "^3.32.0" }, "bin": { "tailwind": "lib/cli.js", "tailwindcss": "lib/cli.js" }, "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "postcss": "^8.0.9" + "node": ">=14.0.0" } }, - "node_modules/tailwindcss/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/tailwindcss/node_modules/postcss-selector-parser": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", - "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -19801,18 +19824,6 @@ "node": ">=4" } }, - "node_modules/tailwindcss/node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -20822,6 +20833,12 @@ "integrity": "sha512-+u76oB43nOHrF4DDWRLWDCtci7f3QJoEBigemIdIeTi1ODqjx6Tad9NCVnPRwewWlKkVab5PlK8DCtPTyX7S8g==", "dev": true }, + "@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true + }, "@ampproject/remapping": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", @@ -21242,14 +21259,14 @@ "dev": true }, "@eslint/eslintrc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", - "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.1", + "espree": "^9.5.2", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -21276,9 +21293,9 @@ } }, "@eslint/js": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.39.0.tgz", - "integrity": "sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng==", + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.41.0.tgz", + "integrity": "sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==", "dev": true }, "@faker-js/faker": { @@ -25864,9 +25881,9 @@ "dev": true }, "@types/node-fetch": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.3.tgz", - "integrity": "sha512-ETTL1mOEdq/sxUtgtOhKjyB2Irra4cjxksvcMUR5Zr4n+PxVhsCD9WS46oPbHL3et9Zde7CNRr+WUNlcHvsX+w==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.4.tgz", + "integrity": "sha512-1ZX9fcN4Rvkvgv4E6PAY5WXUFWFcRWxZa3EW83UjycOB9ljJCedb2CupIP4RZMEwF/M3eTcCihbBRgwtGbg5Rg==", "dev": true, "requires": { "@types/node": "*", @@ -25909,9 +25926,9 @@ "dev": true }, "@types/react": { - "version": "17.0.58", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.58.tgz", - "integrity": "sha512-c1GzVY97P0fGxwGxhYq989j4XwlcHQoto6wQISOC2v6wm3h0PORRWJFHlkRjfGsiG3y1609WdQ+J+tKxvrEd6A==", + "version": "17.0.59", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.59.tgz", + "integrity": "sha512-gSON5zWYIGyoBcycCE75E9+r6dCC2dHdsrVkOEiIYNU5+Q28HcBAuqvDuxHcCbMfHBHdeT5Tva/AFn3rnMKE4g==", "dev": true, "requires": { "@types/prop-types": "*", @@ -26001,9 +26018,9 @@ "dev": true }, "@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", "dev": true }, "@types/stack-utils": { @@ -26043,15 +26060,15 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.0.tgz", - "integrity": "sha512-p0QgrEyrxAWBecR56gyn3wkG15TJdI//eetInP3zYRewDh0XS+DhB3VUAd3QqvziFsfaQIoIuZMxZRB7vXYaYw==", + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.6.tgz", + "integrity": "sha512-sXtOgJNEuRU5RLwPUb1jxtToZbgvq3M6FPpY4QENxoOggK+UpTxUBpj6tD8+Qh2g46Pi9We87E+eHnUw8YcGsw==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.0", - "@typescript-eslint/type-utils": "5.59.0", - "@typescript-eslint/utils": "5.59.0", + "@typescript-eslint/scope-manager": "5.59.6", + "@typescript-eslint/type-utils": "5.59.6", + "@typescript-eslint/utils": "5.59.6", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -26061,9 +26078,9 @@ }, "dependencies": { "semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -26072,53 +26089,53 @@ } }, "@typescript-eslint/parser": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.0.tgz", - "integrity": "sha512-qK9TZ70eJtjojSUMrrEwA9ZDQ4N0e/AuoOIgXuNBorXYcBDk397D2r5MIe1B3cok/oCtdNC5j+lUUpVB+Dpb+w==", + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.6.tgz", + "integrity": "sha512-7pCa6al03Pv1yf/dUg/s1pXz/yGMUBAw5EeWqNTFiSueKvRNonze3hma3lhdsOrQcaOXhbk5gKu2Fludiho9VA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.59.0", - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/typescript-estree": "5.59.0", + "@typescript-eslint/scope-manager": "5.59.6", + "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/typescript-estree": "5.59.6", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.0.tgz", - "integrity": "sha512-tsoldKaMh7izN6BvkK6zRMINj4Z2d6gGhO2UsI8zGZY3XhLq1DndP3Ycjhi1JwdwPRwtLMW4EFPgpuKhbCGOvQ==", + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.6.tgz", + "integrity": "sha512-gLbY3Le9Dxcb8KdpF0+SJr6EQ+hFGYFl6tVY8VxLPFDfUZC7BHFw+Vq7bM5lE9DwWPfx4vMWWTLGXgpc0mAYyQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/visitor-keys": "5.59.0" + "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/visitor-keys": "5.59.6" } }, "@typescript-eslint/type-utils": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.0.tgz", - "integrity": "sha512-d/B6VSWnZwu70kcKQSCqjcXpVH+7ABKH8P1KNn4K7j5PXXuycZTPXF44Nui0TEm6rbWGi8kc78xRgOC4n7xFgA==", + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.6.tgz", + "integrity": "sha512-A4tms2Mp5yNvLDlySF+kAThV9VTBPCvGf0Rp8nl/eoDX9Okun8byTKoj3fJ52IJitjWOk0fKPNQhXEB++eNozQ==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.59.0", - "@typescript-eslint/utils": "5.59.0", + "@typescript-eslint/typescript-estree": "5.59.6", + "@typescript-eslint/utils": "5.59.6", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.0.tgz", - "integrity": "sha512-yR2h1NotF23xFFYKHZs17QJnB51J/s+ud4PYU4MqdZbzeNxpgUr05+dNeCN/bb6raslHvGdd6BFCkVhpPk/ZeA==", + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.6.tgz", + "integrity": "sha512-tH5lBXZI7T2MOUgOWFdVNUILsI02shyQvfzG9EJkoONWugCG77NDDa1EeDGw7oJ5IvsTAAGVV8I3Tk2PNu9QfA==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.0.tgz", - "integrity": "sha512-sUNnktjmI8DyGzPdZ8dRwW741zopGxltGs/SAPgGL/AAgDpiLsCFLcMNSpbfXfmnNeHmK9h3wGmCkGRGAoUZAg==", + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.6.tgz", + "integrity": "sha512-vW6JP3lMAs/Tq4KjdI/RiHaaJSO7IUsbkz17it/Rl9Q+WkQ77EOuOnlbaU8kKfVIOJxMhnRiBG+olE7f3M16DA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/visitor-keys": "5.59.0", + "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/visitor-keys": "5.59.6", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -26127,9 +26144,9 @@ }, "dependencies": { "semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -26138,25 +26155,25 @@ } }, "@typescript-eslint/utils": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.0.tgz", - "integrity": "sha512-GGLFd+86drlHSvPgN/el6dRQNYYGOvRSDVydsUaQluwIW3HvbXuxyuD5JETvBt/9qGYe+lOrDk6gRrWOHb/FvA==", + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.6.tgz", + "integrity": "sha512-vzaaD6EXbTS29cVH0JjXBdzMt6VBlv+hE31XktDRMX1j3462wZCJa7VzO2AxXEXcIl8GQqZPcOPuW/Z1tZVogg==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.0", - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/typescript-estree": "5.59.0", + "@typescript-eslint/scope-manager": "5.59.6", + "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/typescript-estree": "5.59.6", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, "dependencies": { "semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -26165,12 +26182,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.0.tgz", - "integrity": "sha512-qZ3iXxQhanchCeaExlKPV3gDQFxMUmU35xfd5eCXB6+kUw1TUAbIy2n7QIrwz9s98DQLzNWyHp61fY0da4ZcbA==", + "version": "5.59.6", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.6.tgz", + "integrity": "sha512-zEfbFLzB9ETcEJ4HZEEsCR9HHeNku5/Qw1jSS5McYJv5BR+ftYXwFFAH5Al+xkGaZEqowMwl7uoJjQb1YSPF8Q==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/types": "5.59.6", "eslint-visitor-keys": "^3.3.0" } }, @@ -27595,15 +27612,15 @@ } }, "eslint": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.39.0.tgz", - "integrity": "sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==", + "version": "8.41.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.41.0.tgz", + "integrity": "sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.2", - "@eslint/js": "8.39.0", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.41.0", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -27614,8 +27631,8 @@ "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.0", - "espree": "^9.5.1", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -27623,13 +27640,12 @@ "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", @@ -27966,20 +27982,20 @@ } }, "eslint-visitor-keys": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", - "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true }, "espree": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", - "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", "dev": true, "requires": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.0" + "eslint-visitor-keys": "^3.4.1" } }, "esprima": { @@ -28436,6 +28452,12 @@ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", "dev": true }, + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, "handlebars": { "version": "4.7.7", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", @@ -31065,12 +31087,6 @@ "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==", "dev": true }, - "js-sdsl": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.5.tgz", - "integrity": "sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==", - "dev": true - }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -31259,9 +31275,9 @@ } }, "lilconfig": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.6.tgz", - "integrity": "sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", "dev": true }, "lines-and-columns": { @@ -31714,9 +31730,9 @@ } }, "node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", "dev": true, "requires": { "whatwg-url": "^5.0.0" @@ -34013,9 +34029,9 @@ } }, "postcss-import": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", - "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", "dev": true, "requires": { "postcss-value-parser": "^4.0.0", @@ -34024,31 +34040,51 @@ } }, "postcss-js": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.0.tgz", - "integrity": "sha512-77QESFBwgX4irogGVPgQ5s07vLvFqWr228qZY+w6lW599cRlK/HmnlivnnVUxkjHnCu4J16PDMHcH+e+2HbvTQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", "dev": true, "requires": { "camelcase-css": "^2.0.1" } }, "postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", "dev": true, "requires": { "lilconfig": "^2.0.5", - "yaml": "^1.10.2" + "yaml": "^2.1.1" + }, + "dependencies": { + "yaml": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz", + "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==", + "dev": true + } } }, "postcss-nested": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz", - "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", "dev": true, "requires": { - "postcss-selector-parser": "^6.0.10" + "postcss-selector-parser": "^6.0.11" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + } } }, "postcss-selector-parser": { @@ -34457,12 +34493,12 @@ "dev": true }, "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dev": true, "requires": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.11.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -35142,58 +35178,45 @@ "dev": true }, "tailwindcss": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.1.tgz", - "integrity": "sha512-Vkiouc41d4CEq0ujXl6oiGFQ7bA3WEhUZdTgXAhtKxSy49OmKs8rEfQmupsfF0IGW8fv2iQkp1EVUuapCFrZ9g==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.2.tgz", + "integrity": "sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==", "dev": true, "requires": { + "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", "chokidar": "^3.5.3", - "color-name": "^1.1.4", "didyoumean": "^1.2.2", "dlv": "^1.1.3", "fast-glob": "^3.2.12", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", - "jiti": "^1.17.2", - "lilconfig": "^2.0.6", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.0.0", - "postcss": "^8.0.9", - "postcss-import": "^14.1.0", - "postcss-js": "^4.0.0", - "postcss-load-config": "^3.1.4", - "postcss-nested": "6.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", "postcss-selector-parser": "^6.0.11", "postcss-value-parser": "^4.2.0", - "quick-lru": "^5.1.1", - "resolve": "^1.22.1", - "sucrase": "^3.29.0" + "resolve": "^1.22.2", + "sucrase": "^3.32.0" }, "dependencies": { - "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 - }, "postcss-selector-parser": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", - "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", "dev": true, "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } - }, - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true } } }, diff --git a/package.json b/package.json index 1604d809..7a6a9c13 100644 --- a/package.json +++ b/package.json @@ -35,15 +35,15 @@ "@testing-library/react": "12.1.5", "@testing-library/user-event": "14.4.3", "@types/node": "17.0.21", - "@types/node-fetch": "2.6.3", - "@types/react": "17.0.58", + "@types/node-fetch": "2.6.4", + "@types/react": "17.0.59", "@types/sanitize-html": "2.9.0", - "@typescript-eslint/eslint-plugin": "5.59.0", - "@typescript-eslint/parser": "5.59.0", + "@typescript-eslint/eslint-plugin": "5.59.6", + "@typescript-eslint/parser": "5.59.6", "autoprefixer": "10.4.14", "babel-plugin-inline-react-svg": "2.0.2", "dotenv": "16.0.3", - "eslint": "8.39.0", + "eslint": "8.41.0", "eslint-config-next": "12.3.4", "eslint-config-prettier": "8.8.0", "eslint-import-resolver-typescript": "2.7.1", @@ -54,10 +54,10 @@ "jest": "28.1.3", "jest-environment-jsdom": "28.1.3", "jest-fetch-mock": "3.0.3", - "node-fetch": "2.6.9", + "node-fetch": "2.6.11", "postcss": "8.4.23", "prettier": "2.8.8", - "tailwindcss": "3.3.1", + "tailwindcss": "3.3.2", "ts-node": "10.9.1", "tsconfig-paths-webpack-plugin": "3.5.2", "typescript": "4.9.5" From 8389abb167f7bf67f6ee04ecc9db124ff0c03f79 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 4 Jun 2023 22:06:04 +0000 Subject: [PATCH 02/76] chore(deps): update devdependencies-non-major --- package-lock.json | 267 +++++++++++++++++++++++----------------------- package.json | 12 +-- 2 files changed, 141 insertions(+), 138 deletions(-) diff --git a/package-lock.json b/package-lock.json index b6d7898a..064071c8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,14 +29,14 @@ "@testing-library/user-event": "14.4.3", "@types/node": "17.0.21", "@types/node-fetch": "2.6.4", - "@types/react": "17.0.59", + "@types/react": "17.0.60", "@types/sanitize-html": "2.9.0", - "@typescript-eslint/eslint-plugin": "5.59.6", - "@typescript-eslint/parser": "5.59.6", + "@typescript-eslint/eslint-plugin": "5.59.8", + "@typescript-eslint/parser": "5.59.8", "autoprefixer": "10.4.14", "babel-plugin-inline-react-svg": "2.0.2", - "dotenv": "16.0.3", - "eslint": "8.41.0", + "dotenv": "16.1.4", + "eslint": "8.42.0", "eslint-config-next": "12.3.4", "eslint-config-prettier": "8.8.0", "eslint-import-resolver-typescript": "2.7.1", @@ -48,7 +48,7 @@ "jest-environment-jsdom": "28.1.3", "jest-fetch-mock": "3.0.3", "node-fetch": "2.6.11", - "postcss": "8.4.23", + "postcss": "8.4.24", "prettier": "2.8.8", "tailwindcss": "3.3.2", "ts-node": "10.9.1", @@ -685,9 +685,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.41.0.tgz", - "integrity": "sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.42.0.tgz", + "integrity": "sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -719,9 +719,9 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -7085,9 +7085,9 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", "dev": true }, "node_modules/@types/json5": { @@ -7169,9 +7169,9 @@ "dev": true }, "node_modules/@types/react": { - "version": "17.0.59", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.59.tgz", - "integrity": "sha512-gSON5zWYIGyoBcycCE75E9+r6dCC2dHdsrVkOEiIYNU5+Q28HcBAuqvDuxHcCbMfHBHdeT5Tva/AFn3rnMKE4g==", + "version": "17.0.60", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.60.tgz", + "integrity": "sha512-pCH7bqWIfzHs3D+PDs3O/COCQJka+Kcw3RnO9rFA2zalqoXg7cNjJDh6mZ7oRtY1wmY4LVwDdAbA1F7Z8tv3BQ==", "dev": true, "dependencies": { "@types/prop-types": "*", @@ -7326,15 +7326,15 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.6.tgz", - "integrity": "sha512-sXtOgJNEuRU5RLwPUb1jxtToZbgvq3M6FPpY4QENxoOggK+UpTxUBpj6tD8+Qh2g46Pi9We87E+eHnUw8YcGsw==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.8.tgz", + "integrity": "sha512-JDMOmhXteJ4WVKOiHXGCoB96ADWg9q7efPWHRViT/f09bA8XOMLAVHHju3l0MkZnG1izaWXYmgvQcUjTRcpShQ==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.6", - "@typescript-eslint/type-utils": "5.59.6", - "@typescript-eslint/utils": "5.59.6", + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/type-utils": "5.59.8", + "@typescript-eslint/utils": "5.59.8", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -7375,14 +7375,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.6.tgz", - "integrity": "sha512-7pCa6al03Pv1yf/dUg/s1pXz/yGMUBAw5EeWqNTFiSueKvRNonze3hma3lhdsOrQcaOXhbk5gKu2Fludiho9VA==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.8.tgz", + "integrity": "sha512-AnR19RjJcpjoeGojmwZtCwBX/RidqDZtzcbG3xHrmz0aHHoOcbWnpDllenRDmDvsV0RQ6+tbb09/kyc+UT9Orw==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.59.6", - "@typescript-eslint/types": "5.59.6", - "@typescript-eslint/typescript-estree": "5.59.6", + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/typescript-estree": "5.59.8", "debug": "^4.3.4" }, "engines": { @@ -7402,13 +7402,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.6.tgz", - "integrity": "sha512-gLbY3Le9Dxcb8KdpF0+SJr6EQ+hFGYFl6tVY8VxLPFDfUZC7BHFw+Vq7bM5lE9DwWPfx4vMWWTLGXgpc0mAYyQ==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz", + "integrity": "sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.6", - "@typescript-eslint/visitor-keys": "5.59.6" + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -7419,13 +7419,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.6.tgz", - "integrity": "sha512-A4tms2Mp5yNvLDlySF+kAThV9VTBPCvGf0Rp8nl/eoDX9Okun8byTKoj3fJ52IJitjWOk0fKPNQhXEB++eNozQ==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.8.tgz", + "integrity": "sha512-+5M518uEIHFBy3FnyqZUF3BMP+AXnYn4oyH8RF012+e7/msMY98FhGL5SrN29NQ9xDgvqCgYnsOiKp1VjZ/fpA==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.59.6", - "@typescript-eslint/utils": "5.59.6", + "@typescript-eslint/typescript-estree": "5.59.8", + "@typescript-eslint/utils": "5.59.8", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -7446,9 +7446,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.6.tgz", - "integrity": "sha512-tH5lBXZI7T2MOUgOWFdVNUILsI02shyQvfzG9EJkoONWugCG77NDDa1EeDGw7oJ5IvsTAAGVV8I3Tk2PNu9QfA==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", + "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -7459,13 +7459,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.6.tgz", - "integrity": "sha512-vW6JP3lMAs/Tq4KjdI/RiHaaJSO7IUsbkz17it/Rl9Q+WkQ77EOuOnlbaU8kKfVIOJxMhnRiBG+olE7f3M16DA==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz", + "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.6", - "@typescript-eslint/visitor-keys": "5.59.6", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -7501,17 +7501,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.6.tgz", - "integrity": "sha512-vzaaD6EXbTS29cVH0JjXBdzMt6VBlv+hE31XktDRMX1j3462wZCJa7VzO2AxXEXcIl8GQqZPcOPuW/Z1tZVogg==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.8.tgz", + "integrity": "sha512-Tr65630KysnNn9f9G7ROF3w1b5/7f6QVCJ+WK9nhIocWmx9F+TmCAcglF26Vm7z8KCTwoKcNEBZrhlklla3CKg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.6", - "@typescript-eslint/types": "5.59.6", - "@typescript-eslint/typescript-estree": "5.59.6", + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/typescript-estree": "5.59.8", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -7542,12 +7542,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.6.tgz", - "integrity": "sha512-zEfbFLzB9ETcEJ4HZEEsCR9HHeNku5/Qw1jSS5McYJv5BR+ftYXwFFAH5Al+xkGaZEqowMwl7uoJjQb1YSPF8Q==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", + "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/types": "5.59.8", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -9164,12 +9164,15 @@ } }, "node_modules/dotenv": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", - "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.1.4.tgz", + "integrity": "sha512-m55RtE8AsPeJBpOIFKihEmqUcoVncQIwo7x9U8ZwLEZw9ZpXboz2c+rvog+jUaJvVrZ5kBOeYQBX5+8Aa/OZQw==", "dev": true, "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" } }, "node_modules/duplexer2": { @@ -9429,16 +9432,16 @@ } }, "node_modules/eslint": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.41.0.tgz", - "integrity": "sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.42.0.tgz", + "integrity": "sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.41.0", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint/js": "8.42.0", + "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", @@ -18236,9 +18239,9 @@ } }, "node_modules/postcss": { - "version": "8.4.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", - "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", + "version": "8.4.24", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", + "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", "funding": [ { "type": "opencollective", @@ -21293,9 +21296,9 @@ } }, "@eslint/js": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.41.0.tgz", - "integrity": "sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.42.0.tgz", + "integrity": "sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw==", "dev": true }, "@faker-js/faker": { @@ -21313,9 +21316,9 @@ } }, "@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", "dev": true, "requires": { "@humanwhocodes/object-schema": "^1.2.1", @@ -25842,9 +25845,9 @@ } }, "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", "dev": true }, "@types/json5": { @@ -25926,9 +25929,9 @@ "dev": true }, "@types/react": { - "version": "17.0.59", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.59.tgz", - "integrity": "sha512-gSON5zWYIGyoBcycCE75E9+r6dCC2dHdsrVkOEiIYNU5+Q28HcBAuqvDuxHcCbMfHBHdeT5Tva/AFn3rnMKE4g==", + "version": "17.0.60", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.60.tgz", + "integrity": "sha512-pCH7bqWIfzHs3D+PDs3O/COCQJka+Kcw3RnO9rFA2zalqoXg7cNjJDh6mZ7oRtY1wmY4LVwDdAbA1F7Z8tv3BQ==", "dev": true, "requires": { "@types/prop-types": "*", @@ -26060,15 +26063,15 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.6.tgz", - "integrity": "sha512-sXtOgJNEuRU5RLwPUb1jxtToZbgvq3M6FPpY4QENxoOggK+UpTxUBpj6tD8+Qh2g46Pi9We87E+eHnUw8YcGsw==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.8.tgz", + "integrity": "sha512-JDMOmhXteJ4WVKOiHXGCoB96ADWg9q7efPWHRViT/f09bA8XOMLAVHHju3l0MkZnG1izaWXYmgvQcUjTRcpShQ==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.6", - "@typescript-eslint/type-utils": "5.59.6", - "@typescript-eslint/utils": "5.59.6", + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/type-utils": "5.59.8", + "@typescript-eslint/utils": "5.59.8", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -26089,53 +26092,53 @@ } }, "@typescript-eslint/parser": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.6.tgz", - "integrity": "sha512-7pCa6al03Pv1yf/dUg/s1pXz/yGMUBAw5EeWqNTFiSueKvRNonze3hma3lhdsOrQcaOXhbk5gKu2Fludiho9VA==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.8.tgz", + "integrity": "sha512-AnR19RjJcpjoeGojmwZtCwBX/RidqDZtzcbG3xHrmz0aHHoOcbWnpDllenRDmDvsV0RQ6+tbb09/kyc+UT9Orw==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.59.6", - "@typescript-eslint/types": "5.59.6", - "@typescript-eslint/typescript-estree": "5.59.6", + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/typescript-estree": "5.59.8", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.6.tgz", - "integrity": "sha512-gLbY3Le9Dxcb8KdpF0+SJr6EQ+hFGYFl6tVY8VxLPFDfUZC7BHFw+Vq7bM5lE9DwWPfx4vMWWTLGXgpc0mAYyQ==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz", + "integrity": "sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.6", - "@typescript-eslint/visitor-keys": "5.59.6" + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8" } }, "@typescript-eslint/type-utils": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.6.tgz", - "integrity": "sha512-A4tms2Mp5yNvLDlySF+kAThV9VTBPCvGf0Rp8nl/eoDX9Okun8byTKoj3fJ52IJitjWOk0fKPNQhXEB++eNozQ==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.8.tgz", + "integrity": "sha512-+5M518uEIHFBy3FnyqZUF3BMP+AXnYn4oyH8RF012+e7/msMY98FhGL5SrN29NQ9xDgvqCgYnsOiKp1VjZ/fpA==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.59.6", - "@typescript-eslint/utils": "5.59.6", + "@typescript-eslint/typescript-estree": "5.59.8", + "@typescript-eslint/utils": "5.59.8", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.6.tgz", - "integrity": "sha512-tH5lBXZI7T2MOUgOWFdVNUILsI02shyQvfzG9EJkoONWugCG77NDDa1EeDGw7oJ5IvsTAAGVV8I3Tk2PNu9QfA==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", + "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.6.tgz", - "integrity": "sha512-vW6JP3lMAs/Tq4KjdI/RiHaaJSO7IUsbkz17it/Rl9Q+WkQ77EOuOnlbaU8kKfVIOJxMhnRiBG+olE7f3M16DA==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz", + "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.6", - "@typescript-eslint/visitor-keys": "5.59.6", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -26155,17 +26158,17 @@ } }, "@typescript-eslint/utils": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.6.tgz", - "integrity": "sha512-vzaaD6EXbTS29cVH0JjXBdzMt6VBlv+hE31XktDRMX1j3462wZCJa7VzO2AxXEXcIl8GQqZPcOPuW/Z1tZVogg==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.8.tgz", + "integrity": "sha512-Tr65630KysnNn9f9G7ROF3w1b5/7f6QVCJ+WK9nhIocWmx9F+TmCAcglF26Vm7z8KCTwoKcNEBZrhlklla3CKg==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.6", - "@typescript-eslint/types": "5.59.6", - "@typescript-eslint/typescript-estree": "5.59.6", + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/typescript-estree": "5.59.8", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -26182,12 +26185,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.6.tgz", - "integrity": "sha512-zEfbFLzB9ETcEJ4HZEEsCR9HHeNku5/Qw1jSS5McYJv5BR+ftYXwFFAH5Al+xkGaZEqowMwl7uoJjQb1YSPF8Q==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", + "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/types": "5.59.8", "eslint-visitor-keys": "^3.3.0" } }, @@ -27405,9 +27408,9 @@ } }, "dotenv": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", - "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "version": "16.1.4", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.1.4.tgz", + "integrity": "sha512-m55RtE8AsPeJBpOIFKihEmqUcoVncQIwo7x9U8ZwLEZw9ZpXboz2c+rvog+jUaJvVrZ5kBOeYQBX5+8Aa/OZQw==", "dev": true }, "duplexer2": { @@ -27612,16 +27615,16 @@ } }, "eslint": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.41.0.tgz", - "integrity": "sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==", + "version": "8.42.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.42.0.tgz", + "integrity": "sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.41.0", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint/js": "8.42.0", + "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", @@ -34019,9 +34022,9 @@ } }, "postcss": { - "version": "8.4.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", - "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", + "version": "8.4.24", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", + "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", "requires": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", diff --git a/package.json b/package.json index 7a6a9c13..ca87474f 100644 --- a/package.json +++ b/package.json @@ -36,14 +36,14 @@ "@testing-library/user-event": "14.4.3", "@types/node": "17.0.21", "@types/node-fetch": "2.6.4", - "@types/react": "17.0.59", + "@types/react": "17.0.60", "@types/sanitize-html": "2.9.0", - "@typescript-eslint/eslint-plugin": "5.59.6", - "@typescript-eslint/parser": "5.59.6", + "@typescript-eslint/eslint-plugin": "5.59.8", + "@typescript-eslint/parser": "5.59.8", "autoprefixer": "10.4.14", "babel-plugin-inline-react-svg": "2.0.2", - "dotenv": "16.0.3", - "eslint": "8.41.0", + "dotenv": "16.1.4", + "eslint": "8.42.0", "eslint-config-next": "12.3.4", "eslint-config-prettier": "8.8.0", "eslint-import-resolver-typescript": "2.7.1", @@ -55,7 +55,7 @@ "jest-environment-jsdom": "28.1.3", "jest-fetch-mock": "3.0.3", "node-fetch": "2.6.11", - "postcss": "8.4.23", + "postcss": "8.4.24", "prettier": "2.8.8", "tailwindcss": "3.3.2", "ts-node": "10.9.1", From 45b9541d224a33a6210d5907bfa2f0e41c1f28ff Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 19 Jun 2023 00:47:08 +0000 Subject: [PATCH 03/76] chore(deps): update devdependencies-non-major --- package-lock.json | 258 +++++++++++++++++++++++----------------------- package.json | 10 +- 2 files changed, 134 insertions(+), 134 deletions(-) diff --git a/package-lock.json b/package-lock.json index 064071c8..80589586 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,14 +29,14 @@ "@testing-library/user-event": "14.4.3", "@types/node": "17.0.21", "@types/node-fetch": "2.6.4", - "@types/react": "17.0.60", + "@types/react": "17.0.62", "@types/sanitize-html": "2.9.0", - "@typescript-eslint/eslint-plugin": "5.59.8", - "@typescript-eslint/parser": "5.59.8", + "@typescript-eslint/eslint-plugin": "5.59.11", + "@typescript-eslint/parser": "5.59.11", "autoprefixer": "10.4.14", "babel-plugin-inline-react-svg": "2.0.2", - "dotenv": "16.1.4", - "eslint": "8.42.0", + "dotenv": "16.3.1", + "eslint": "8.43.0", "eslint-config-next": "12.3.4", "eslint-config-prettier": "8.8.0", "eslint-import-resolver-typescript": "2.7.1", @@ -685,9 +685,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.42.0.tgz", - "integrity": "sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw==", + "version": "8.43.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.43.0.tgz", + "integrity": "sha512-s2UHCoiXfxMvmfzqoN+vrQ84ahUSYde9qNO1MdxmoEhyHWsfmwOpFlwYV+ePJEVc7gFnATGUi376WowX1N7tFg==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -7169,9 +7169,9 @@ "dev": true }, "node_modules/@types/react": { - "version": "17.0.60", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.60.tgz", - "integrity": "sha512-pCH7bqWIfzHs3D+PDs3O/COCQJka+Kcw3RnO9rFA2zalqoXg7cNjJDh6mZ7oRtY1wmY4LVwDdAbA1F7Z8tv3BQ==", + "version": "17.0.62", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.62.tgz", + "integrity": "sha512-eANCyz9DG8p/Vdhr0ZKST8JV12PhH2ACCDYlFw6DIO+D+ca+uP4jtEDEpVqXZrh/uZdXQGwk7whJa3ah5DtyLw==", "dev": true, "dependencies": { "@types/prop-types": "*", @@ -7326,15 +7326,15 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.8.tgz", - "integrity": "sha512-JDMOmhXteJ4WVKOiHXGCoB96ADWg9q7efPWHRViT/f09bA8XOMLAVHHju3l0MkZnG1izaWXYmgvQcUjTRcpShQ==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.11.tgz", + "integrity": "sha512-XxuOfTkCUiOSyBWIvHlUraLw/JT/6Io1365RO6ZuI88STKMavJZPNMU0lFcUTeQXEhHiv64CbxYxBNoDVSmghg==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.8", - "@typescript-eslint/type-utils": "5.59.8", - "@typescript-eslint/utils": "5.59.8", + "@typescript-eslint/scope-manager": "5.59.11", + "@typescript-eslint/type-utils": "5.59.11", + "@typescript-eslint/utils": "5.59.11", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -7360,9 +7360,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", + "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -7375,14 +7375,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.8.tgz", - "integrity": "sha512-AnR19RjJcpjoeGojmwZtCwBX/RidqDZtzcbG3xHrmz0aHHoOcbWnpDllenRDmDvsV0RQ6+tbb09/kyc+UT9Orw==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.11.tgz", + "integrity": "sha512-s9ZF3M+Nym6CAZEkJJeO2TFHHDsKAM3ecNkLuH4i4s8/RCPnF5JRip2GyviYkeEAcwGMJxkqG9h2dAsnA1nZpA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.59.8", - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/typescript-estree": "5.59.8", + "@typescript-eslint/scope-manager": "5.59.11", + "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/typescript-estree": "5.59.11", "debug": "^4.3.4" }, "engines": { @@ -7402,13 +7402,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz", - "integrity": "sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.11.tgz", + "integrity": "sha512-dHFOsxoLFtrIcSj5h0QoBT/89hxQONwmn3FOQ0GOQcLOOXm+MIrS8zEAhs4tWl5MraxCY3ZJpaXQQdFMc2Tu+Q==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/visitor-keys": "5.59.8" + "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/visitor-keys": "5.59.11" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -7419,13 +7419,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.8.tgz", - "integrity": "sha512-+5M518uEIHFBy3FnyqZUF3BMP+AXnYn4oyH8RF012+e7/msMY98FhGL5SrN29NQ9xDgvqCgYnsOiKp1VjZ/fpA==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.11.tgz", + "integrity": "sha512-LZqVY8hMiVRF2a7/swmkStMYSoXMFlzL6sXV6U/2gL5cwnLWQgLEG8tjWPpaE4rMIdZ6VKWwcffPlo1jPfk43g==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.59.8", - "@typescript-eslint/utils": "5.59.8", + "@typescript-eslint/typescript-estree": "5.59.11", + "@typescript-eslint/utils": "5.59.11", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -7446,9 +7446,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", - "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.11.tgz", + "integrity": "sha512-epoN6R6tkvBYSc+cllrz+c2sOFWkbisJZWkOE+y3xHtvYaOE6Wk6B8e114McRJwFRjGvYdJwLXQH5c9osME/AA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -7459,13 +7459,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz", - "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.11.tgz", + "integrity": "sha512-YupOpot5hJO0maupJXixi6l5ETdrITxeo5eBOeuV7RSKgYdU3G5cxO49/9WRnJq9EMrB7AuTSLH/bqOsXi7wPA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/visitor-keys": "5.59.8", + "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/visitor-keys": "5.59.11", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -7486,9 +7486,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", + "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -7501,17 +7501,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.8.tgz", - "integrity": "sha512-Tr65630KysnNn9f9G7ROF3w1b5/7f6QVCJ+WK9nhIocWmx9F+TmCAcglF26Vm7z8KCTwoKcNEBZrhlklla3CKg==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.11.tgz", + "integrity": "sha512-didu2rHSOMUdJThLk4aZ1Or8IcO3HzCw/ZvEjTTIfjIrcdd5cvSIwwDy2AOlE7htSNp7QIZ10fLMyRCveesMLg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.8", - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/typescript-estree": "5.59.8", + "@typescript-eslint/scope-manager": "5.59.11", + "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/typescript-estree": "5.59.11", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -7527,9 +7527,9 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", + "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -7542,12 +7542,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", - "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.11.tgz", + "integrity": "sha512-KGYniTGG3AMTuKF9QBD7EIrvufkB6O6uX3knP73xbKLMpH+QRPcgnCxjWXSHjMRuOxFLovljqQgQpR0c7GvjoA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/types": "5.59.11", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -9164,9 +9164,9 @@ } }, "node_modules/dotenv": { - "version": "16.1.4", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.1.4.tgz", - "integrity": "sha512-m55RtE8AsPeJBpOIFKihEmqUcoVncQIwo7x9U8ZwLEZw9ZpXboz2c+rvog+jUaJvVrZ5kBOeYQBX5+8Aa/OZQw==", + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", "dev": true, "engines": { "node": ">=12" @@ -9432,15 +9432,15 @@ } }, "node_modules/eslint": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.42.0.tgz", - "integrity": "sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A==", + "version": "8.43.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.43.0.tgz", + "integrity": "sha512-aaCpf2JqqKesMFGgmRPessmVKjcGXqdlAYLLC3THM8t5nBRZRQ+st5WM/hoJXkdioEXLLbXgclUpM0TXo5HX5Q==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.42.0", + "@eslint/js": "8.43.0", "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -21296,9 +21296,9 @@ } }, "@eslint/js": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.42.0.tgz", - "integrity": "sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw==", + "version": "8.43.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.43.0.tgz", + "integrity": "sha512-s2UHCoiXfxMvmfzqoN+vrQ84ahUSYde9qNO1MdxmoEhyHWsfmwOpFlwYV+ePJEVc7gFnATGUi376WowX1N7tFg==", "dev": true }, "@faker-js/faker": { @@ -25929,9 +25929,9 @@ "dev": true }, "@types/react": { - "version": "17.0.60", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.60.tgz", - "integrity": "sha512-pCH7bqWIfzHs3D+PDs3O/COCQJka+Kcw3RnO9rFA2zalqoXg7cNjJDh6mZ7oRtY1wmY4LVwDdAbA1F7Z8tv3BQ==", + "version": "17.0.62", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.62.tgz", + "integrity": "sha512-eANCyz9DG8p/Vdhr0ZKST8JV12PhH2ACCDYlFw6DIO+D+ca+uP4jtEDEpVqXZrh/uZdXQGwk7whJa3ah5DtyLw==", "dev": true, "requires": { "@types/prop-types": "*", @@ -26063,15 +26063,15 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.8.tgz", - "integrity": "sha512-JDMOmhXteJ4WVKOiHXGCoB96ADWg9q7efPWHRViT/f09bA8XOMLAVHHju3l0MkZnG1izaWXYmgvQcUjTRcpShQ==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.11.tgz", + "integrity": "sha512-XxuOfTkCUiOSyBWIvHlUraLw/JT/6Io1365RO6ZuI88STKMavJZPNMU0lFcUTeQXEhHiv64CbxYxBNoDVSmghg==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.8", - "@typescript-eslint/type-utils": "5.59.8", - "@typescript-eslint/utils": "5.59.8", + "@typescript-eslint/scope-manager": "5.59.11", + "@typescript-eslint/type-utils": "5.59.11", + "@typescript-eslint/utils": "5.59.11", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -26081,9 +26081,9 @@ }, "dependencies": { "semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", + "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -26092,53 +26092,53 @@ } }, "@typescript-eslint/parser": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.8.tgz", - "integrity": "sha512-AnR19RjJcpjoeGojmwZtCwBX/RidqDZtzcbG3xHrmz0aHHoOcbWnpDllenRDmDvsV0RQ6+tbb09/kyc+UT9Orw==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.11.tgz", + "integrity": "sha512-s9ZF3M+Nym6CAZEkJJeO2TFHHDsKAM3ecNkLuH4i4s8/RCPnF5JRip2GyviYkeEAcwGMJxkqG9h2dAsnA1nZpA==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.59.8", - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/typescript-estree": "5.59.8", + "@typescript-eslint/scope-manager": "5.59.11", + "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/typescript-estree": "5.59.11", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz", - "integrity": "sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.11.tgz", + "integrity": "sha512-dHFOsxoLFtrIcSj5h0QoBT/89hxQONwmn3FOQ0GOQcLOOXm+MIrS8zEAhs4tWl5MraxCY3ZJpaXQQdFMc2Tu+Q==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/visitor-keys": "5.59.8" + "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/visitor-keys": "5.59.11" } }, "@typescript-eslint/type-utils": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.8.tgz", - "integrity": "sha512-+5M518uEIHFBy3FnyqZUF3BMP+AXnYn4oyH8RF012+e7/msMY98FhGL5SrN29NQ9xDgvqCgYnsOiKp1VjZ/fpA==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.11.tgz", + "integrity": "sha512-LZqVY8hMiVRF2a7/swmkStMYSoXMFlzL6sXV6U/2gL5cwnLWQgLEG8tjWPpaE4rMIdZ6VKWwcffPlo1jPfk43g==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.59.8", - "@typescript-eslint/utils": "5.59.8", + "@typescript-eslint/typescript-estree": "5.59.11", + "@typescript-eslint/utils": "5.59.11", "debug": "^4.3.4", "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", - "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.11.tgz", + "integrity": "sha512-epoN6R6tkvBYSc+cllrz+c2sOFWkbisJZWkOE+y3xHtvYaOE6Wk6B8e114McRJwFRjGvYdJwLXQH5c9osME/AA==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz", - "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.11.tgz", + "integrity": "sha512-YupOpot5hJO0maupJXixi6l5ETdrITxeo5eBOeuV7RSKgYdU3G5cxO49/9WRnJq9EMrB7AuTSLH/bqOsXi7wPA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/visitor-keys": "5.59.8", + "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/visitor-keys": "5.59.11", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -26147,9 +26147,9 @@ }, "dependencies": { "semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", + "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -26158,25 +26158,25 @@ } }, "@typescript-eslint/utils": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.8.tgz", - "integrity": "sha512-Tr65630KysnNn9f9G7ROF3w1b5/7f6QVCJ+WK9nhIocWmx9F+TmCAcglF26Vm7z8KCTwoKcNEBZrhlklla3CKg==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.11.tgz", + "integrity": "sha512-didu2rHSOMUdJThLk4aZ1Or8IcO3HzCw/ZvEjTTIfjIrcdd5cvSIwwDy2AOlE7htSNp7QIZ10fLMyRCveesMLg==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.8", - "@typescript-eslint/types": "5.59.8", - "@typescript-eslint/typescript-estree": "5.59.8", + "@typescript-eslint/scope-manager": "5.59.11", + "@typescript-eslint/types": "5.59.11", + "@typescript-eslint/typescript-estree": "5.59.11", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, "dependencies": { "semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", + "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -26185,12 +26185,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.59.8", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", - "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", + "version": "5.59.11", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.11.tgz", + "integrity": "sha512-KGYniTGG3AMTuKF9QBD7EIrvufkB6O6uX3knP73xbKLMpH+QRPcgnCxjWXSHjMRuOxFLovljqQgQpR0c7GvjoA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/types": "5.59.11", "eslint-visitor-keys": "^3.3.0" } }, @@ -27408,9 +27408,9 @@ } }, "dotenv": { - "version": "16.1.4", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.1.4.tgz", - "integrity": "sha512-m55RtE8AsPeJBpOIFKihEmqUcoVncQIwo7x9U8ZwLEZw9ZpXboz2c+rvog+jUaJvVrZ5kBOeYQBX5+8Aa/OZQw==", + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", "dev": true }, "duplexer2": { @@ -27615,15 +27615,15 @@ } }, "eslint": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.42.0.tgz", - "integrity": "sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A==", + "version": "8.43.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.43.0.tgz", + "integrity": "sha512-aaCpf2JqqKesMFGgmRPessmVKjcGXqdlAYLLC3THM8t5nBRZRQ+st5WM/hoJXkdioEXLLbXgclUpM0TXo5HX5Q==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.42.0", + "@eslint/js": "8.43.0", "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", diff --git a/package.json b/package.json index ca87474f..c273b5b9 100644 --- a/package.json +++ b/package.json @@ -36,14 +36,14 @@ "@testing-library/user-event": "14.4.3", "@types/node": "17.0.21", "@types/node-fetch": "2.6.4", - "@types/react": "17.0.60", + "@types/react": "17.0.62", "@types/sanitize-html": "2.9.0", - "@typescript-eslint/eslint-plugin": "5.59.8", - "@typescript-eslint/parser": "5.59.8", + "@typescript-eslint/eslint-plugin": "5.59.11", + "@typescript-eslint/parser": "5.59.11", "autoprefixer": "10.4.14", "babel-plugin-inline-react-svg": "2.0.2", - "dotenv": "16.1.4", - "eslint": "8.42.0", + "dotenv": "16.3.1", + "eslint": "8.43.0", "eslint-config-next": "12.3.4", "eslint-config-prettier": "8.8.0", "eslint-import-resolver-typescript": "2.7.1", From 6123ad70ab65e34201d4a37a138d688c6cea61a6 Mon Sep 17 00:00:00 2001 From: Lucas Vogel Date: Thu, 3 Aug 2023 12:59:25 +0200 Subject: [PATCH 04/76] fix(history): Fall back to home in bo back button when no history --- pages/info.tsx | 6 ++++-- pages/sofortige-hilfe.tsx | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/pages/info.tsx b/pages/info.tsx index 971dfeb0..79647f02 100644 --- a/pages/info.tsx +++ b/pages/info.tsx @@ -20,14 +20,16 @@ export const getStaticProps: GetStaticProps = async () => { } const Info: Page = () => { - const { back } = useRouter() + const { back, push } = useRouter() return (
Info - HILF-MIR Berlin
- void back()} /> + (history.length > 2 ? void back() : void push('/'))} + />
diff --git a/pages/sofortige-hilfe.tsx b/pages/sofortige-hilfe.tsx index d08b2df7..08bba7f8 100644 --- a/pages/sofortige-hilfe.tsx +++ b/pages/sofortige-hilfe.tsx @@ -26,7 +26,7 @@ const Home: NextPage = () => { const [selectedNeighborhood, setSelectedNeighborhood] = useState( neigborhoodKeys[0] ) - const { back } = useRouter() + const { back, push } = useRouter() const isEmergencyTime = useIsEmergencyTime() @@ -51,7 +51,9 @@ const Home: NextPage = () => {
- void back()} /> + (history.length > 2 ? void back() : void push('/'))} + />

{texts.directHelpButtonText} From 2fa5d0d90d86d176b1a8a79efd7b5dee7cfae1b5 Mon Sep 17 00:00:00 2001 From: Jonas Jaszkowic Date: Thu, 3 Aug 2023 14:05:55 +0200 Subject: [PATCH 05/76] Minimal effort collapsable faq --- src/components/FaqList.tsx | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/components/FaqList.tsx b/src/components/FaqList.tsx index 4a326961..d8adabc6 100644 --- a/src/components/FaqList.tsx +++ b/src/components/FaqList.tsx @@ -1,5 +1,5 @@ /* eslint-disable prettier/prettier */ -import { FC, ReactNode } from 'react' +import { FC, ReactNode, useState } from 'react' const FAQS: { question: string @@ -181,7 +181,10 @@ const FAQS: { answer: ( <>

- HILF-MIR Berlin ist ein Angebot des CityLAB Berlin und wurde durch die Senatsverwaltung für Wissenschaft, Pflege und Gleichstellung unterstützt. + HILF-MIR Berlin ist ein Angebot des{' '} + CityLAB Berlin und wurde + durch die Senatsverwaltung für Wissenschaft, Pflege und Gleichstellung + unterstützt.

), @@ -250,13 +253,23 @@ const FAQS: { ] export const FaqList: FC = () => { + const [expandedQuestion, setExpandedQuestion] = useState() return (

r.labels)} + recordsWithOnlyLabels={(records || []).map((r) => [ + r.id, + r.labels, + ])} onSubmit={() => setFilterSidebarIsOpened(false)} />
diff --git a/src/components/WelcomeFilters.tsx b/src/components/WelcomeFilters.tsx index b1419efa..5f4b0fb1 100644 --- a/src/components/WelcomeFilters.tsx +++ b/src/components/WelcomeFilters.tsx @@ -1,17 +1,17 @@ import { useTexts } from '@lib/TextsContext' import { FC } from 'react' import { BackButton } from './BackButton' -import { TableRowType } from '@common/types/gristData' import { FiltersList } from './FiltersList' import { useIsMobile } from '@lib/hooks/useIsMobile' import { LegalFooter } from './LegalFooter' import classNames from '@lib/classNames' import { TextLink } from './TextLink' import { Footer } from './Footer' +import { RecordsWithOnlyLabelsType } from '@lib/hooks/useFilteredFacilitiesCount' export const WelcomeFilters: FC<{ onGoBack: () => void - recordsWithOnlyLabels: TableRowType['fields']['Schlagworte'][] + recordsWithOnlyLabels: RecordsWithOnlyLabelsType[] }> = ({ onGoBack, recordsWithOnlyLabels }) => { const texts = useTexts() const isMobile = useIsMobile() diff --git a/src/lib/UrlStateContext.tsx b/src/lib/UrlStateContext.tsx index 812da4e1..4125bf38 100644 --- a/src/lib/UrlStateContext.tsx +++ b/src/lib/UrlStateContext.tsx @@ -47,20 +47,20 @@ export const UrlStateProvider: FC = ({ children }) => { return {children} } -export function parseSearchTermUrlCategories( +export function urlSearchCategoriesToStateSearchCategories( qCategories: PageQueryType['qCategories'] ): Partial { - if (!qCategories) return {} + const noCategories = !qCategories || qCategories.length === 0 return { - categorySelfHelp: qCategories.includes(1), - categoryAdvising: qCategories.includes(2), - categoryClinics: qCategories.includes(3), - categoryDisctrictOfficeHelp: qCategories.includes(4), - categoryOnlineOffers: qCategories.includes(5), + categorySelfHelp: noCategories || qCategories.includes(1), + categoryAdvising: noCategories || qCategories.includes(2), + categoryClinics: noCategories || qCategories.includes(3), + categoryDisctrictOfficeHelp: noCategories || qCategories.includes(4), + categoryOnlineOffers: noCategories || qCategories.includes(5), } } -export function parseSearchTermCategories( +export function stateSearchCategoriesToUrlSearchCategories( searchTermCategories: Partial | undefined ): PageQueryType['qCategories'] { if (!searchTermCategories) return undefined diff --git a/src/lib/facilityFilterUtil.ts b/src/lib/facilityFilterUtil.ts index cae3df50..f4c89896 100644 --- a/src/lib/facilityFilterUtil.ts +++ b/src/lib/facilityFilterUtil.ts @@ -4,37 +4,93 @@ import { MinimalRecordType } from './mapRecordToMinimum' interface GetFilteredFacilitiesPropType { facilities: MinimalRecordType[] labels: GristLabelType[] + activeIdsBySearchTerm: MinimalRecordType['id'][] | null } interface IsFaclilityActivePropType { activeTargetLabels: GristLabelType[] activeTopcisLabels: GristLabelType[] facilityLabels: GristLabelType['id'][] - isFilteredByTarget: boolean + facilityId: MinimalRecordType['id'] + activeIdsBySearchTerm: MinimalRecordType['id'][] | null +} + +type GetFilterStatusType = (props: { + activeIdsBySearchTerm: MinimalRecordType['id'][] | null + activeTargetLabels: GristLabelType[] + activeTopcisLabels: GristLabelType[] +}) => { isFilteredByTopic: boolean + isFilteredByTarget: boolean + isFilteredBySearchTerm: boolean + isNotFilteredAtAll: boolean +} + +export const getFilterStatus: GetFilterStatusType = ({ + activeIdsBySearchTerm, + activeTargetLabels, + activeTopcisLabels, +}) => { + const isFilteredBySearchTerm = activeIdsBySearchTerm !== null + const isFilteredByTopic = activeTopcisLabels.length > 0 + const isFilteredByTarget = activeTargetLabels.length > 0 + return { + isFilteredByTopic, + isFilteredByTarget, + isFilteredBySearchTerm, + isNotFilteredAtAll: + !isFilteredByTopic && !isFilteredByTarget && !isFilteredBySearchTerm, + } } export const isFaclilityActive = ({ activeTargetLabels, activeTopcisLabels, - isFilteredByTarget, - isFilteredByTopic, facilityLabels, + facilityId, + activeIdsBySearchTerm, }: IsFaclilityActivePropType): boolean => { - if (!isFilteredByTopic && !isFilteredByTarget) return true + const { + isNotFilteredAtAll, + isFilteredByTopic, + isFilteredByTarget, + isFilteredBySearchTerm, + } = getFilterStatus({ + activeIdsBySearchTerm, + activeTargetLabels, + activeTopcisLabels, + }) + if (isNotFilteredAtAll) return true const hasAllOfTheActiveTopics = activeTopcisLabels?.every((tag) => facilityLabels.includes(tag.id)) || false const hasAnActiveTarget = (activeTargetLabels[0] && facilityLabels.includes(activeTargetLabels[0].id)) || false + const includesTextSearchTerm = + activeIdsBySearchTerm !== null && activeIdsBySearchTerm.includes(facilityId) - if (!isFilteredByTopic && isFilteredByTarget) return hasAnActiveTarget - if (isFilteredByTopic && !isFilteredByTarget) return hasAllOfTheActiveTopics - return hasAllOfTheActiveTopics && hasAnActiveTarget + if (!includesTextSearchTerm) return false + + if (!isFilteredByTopic && !isFilteredBySearchTerm && isFilteredByTarget) + return hasAnActiveTarget + if (isFilteredByTopic && !isFilteredBySearchTerm && !isFilteredByTarget) + return hasAllOfTheActiveTopics + if (isFilteredByTopic && isFilteredBySearchTerm && !isFilteredByTarget) + return hasAllOfTheActiveTopics && includesTextSearchTerm + if (!isFilteredByTopic && isFilteredBySearchTerm && isFilteredByTarget) + return hasAnActiveTarget && includesTextSearchTerm + if (!isFilteredByTopic && isFilteredBySearchTerm && !isFilteredByTarget) + return includesTextSearchTerm + return hasAllOfTheActiveTopics && hasAnActiveTarget && includesTextSearchTerm } -export const getActiveLabelGroups = (labels: GristLabelType[]) => ({ +export const getActiveLabelGroups = ( + labels: GristLabelType[] +): { + activeTopcisLabels: GristLabelType[] + activeTargetLabels: GristLabelType[] +} => ({ activeTopcisLabels: labels.filter( (f) => f.isActive && f.fields.group2 !== 'zielpublikum' ), @@ -46,19 +102,23 @@ export const getActiveLabelGroups = (labels: GristLabelType[]) => ({ export const getFilteredFacilities = ({ facilities, labels, + activeIdsBySearchTerm, }: GetFilteredFacilitiesPropType): MinimalRecordType[] => { const { activeTopcisLabels, activeTargetLabels } = getActiveLabelGroups(labels) - const isFilteredByTopic = activeTopcisLabels.length > 0 - const isFilteredByTarget = activeTargetLabels.length > 0 - if (!isFilteredByTopic && !isFilteredByTarget) return facilities + const { isNotFilteredAtAll } = getFilterStatus({ + activeIdsBySearchTerm, + activeTargetLabels, + activeTopcisLabels, + }) + if (isNotFilteredAtAll) return facilities return facilities.filter((facility) => { return isFaclilityActive({ facilityLabels: facility.labels, + facilityId: facility.id, activeTopcisLabels, activeTargetLabels, - isFilteredByTopic, - isFilteredByTarget, + activeIdsBySearchTerm, }) }) } diff --git a/src/lib/hooks/useActiveIdsBySearchTerm.ts b/src/lib/hooks/useActiveIdsBySearchTerm.ts new file mode 100644 index 00000000..bb106f01 --- /dev/null +++ b/src/lib/hooks/useActiveIdsBySearchTerm.ts @@ -0,0 +1,73 @@ +import { TableRowType } from '@common/types/gristData' +import { + urlSearchCategoriesToStateSearchCategories, + useUrlState, +} from '@lib/UrlStateContext' +import { PageQueryType } from '@lib/mapRawQueryToState' +import { MinimalRecordType } from '@lib/mapRecordToMinimum' +import { useEffect, useState } from 'react' +import useSWR from 'swr' + +interface SearchResult { + result?: TableRowType[] + error?: string + params: Record +} + +interface UseActiveIdsBySearchTermReturnType { + ids: MinimalRecordType['id'][] | null + isLoading: boolean + key: string +} + +export const useActiveIdsBySearchTerm = + (): UseActiveIdsBySearchTermReturnType => { + const [urlState] = useUrlState() + const [ids, setIds] = useState(null) + const q = urlState.q || null + const qCategories = urlState.qCategories || null + const key = `search-${q || 'empty'}-${qCategories?.join('-') || 'empty'}` + const { data, isLoading } = useSWR(key, async () => + searchRecords(q, qCategories) + ) + + useEffect(() => { + if (!data?.result) return + setIds(data.result.map((r) => r.id)) + }, [data]) + + return { + ids, + isLoading, + key: ids?.join('-') || 'empty', + } + } + +async function searchRecords( + q: string | null, + qCategories: PageQueryType['qCategories'] | null +): Promise { + if (q === null && qCategories === null) return { params: {} } + const url = new URLSearchParams({ + query: q || '', + filters: qCategories ? categoriesToFilterString(qCategories) : '', + }) + const response = await fetch(`/api/search?${url.toString()}`) + if (!response.ok) throw new Error(await response.text()) + return (await response.json()) as SearchResult +} + +function categoriesToFilterString( + categories: PageQueryType['qCategories'] +): string { + const categoriesState = urlSearchCategoriesToStateSearchCategories(categories) + return [ + categoriesState.categoryAdvising && 'Beratung', + categoriesState.categoryClinics && 'Klinik', + categoriesState.categoryDisctrictOfficeHelp && 'Amt', + categoriesState.categoryOnlineOffers && 'Online', + categoriesState.categorySelfHelp && 'Selbsthilfe', + ] + .filter(Boolean) + .join(',') +} diff --git a/src/lib/hooks/useFilteredFacilitiesCount.ts b/src/lib/hooks/useFilteredFacilitiesCount.ts index f61a35bc..5683fb95 100644 --- a/src/lib/hooks/useFilteredFacilitiesCount.ts +++ b/src/lib/hooks/useFilteredFacilitiesCount.ts @@ -1,19 +1,27 @@ import { TableRowType } from '@common/types/gristData' import { getActiveLabelGroups, + getFilterStatus, isFaclilityActive, } from '@lib/facilityFilterUtil' import { useEffect, useState } from 'react' import { useFiltersWithActiveProp } from './useFiltersWithActiveProp' +import { useActiveIdsBySearchTerm } from './useActiveIdsBySearchTerm' + +export type RecordsWithOnlyLabelsType = [ + id: TableRowType['id'], + labels: TableRowType['fields']['Schlagworte'] +] export const useFilteredFacilitiesCount = ( - facilitiesWithOnlyLabels: TableRowType['fields']['Schlagworte'][] + facilitiesWithOnlyLabels: RecordsWithOnlyLabelsType[] ): number => { const labels = useFiltersWithActiveProp() const concatenatedActiveLabelIds = labels .filter((label) => label.isActive) .map((label) => label.id) .join('-') + const activeIdsBySearchTerm = useActiveIdsBySearchTerm() const [filteredFacilities, setFilteredFacilities] = useState( facilitiesWithOnlyLabels @@ -23,25 +31,35 @@ export const useFilteredFacilitiesCount = ( const { activeTopcisLabels, activeTargetLabels } = getActiveLabelGroups(labels) - const isFilteredByTopic = activeTopcisLabels.length > 0 - const isFilteredByTarget = activeTargetLabels.length > 0 + const { isNotFilteredAtAll } = getFilterStatus({ + activeIdsBySearchTerm: activeIdsBySearchTerm.ids, + activeTargetLabels, + activeTopcisLabels, + }) + + if (isNotFilteredAtAll) { + setFilteredFacilities(facilitiesWithOnlyLabels) + return + } const filteredFacilities = facilitiesWithOnlyLabels.filter( - (recordLabels) => { - if (!isFilteredByTopic && !isFilteredByTarget) return true - return isFaclilityActive({ - isFilteredByTopic, - isFilteredByTarget, + ([id, recordLabels]) => + isFaclilityActive({ facilityLabels: recordLabels, + facilityId: id, activeTargetLabels: activeTargetLabels, activeTopcisLabels: activeTopcisLabels, + activeIdsBySearchTerm: activeIdsBySearchTerm.ids, }) - } ) setFilteredFacilities(filteredFacilities) // eslint-disable-next-line react-hooks/exhaustive-deps - }, [concatenatedActiveLabelIds, facilitiesWithOnlyLabels]) + }, [ + concatenatedActiveLabelIds, + facilitiesWithOnlyLabels, + activeIdsBySearchTerm.key, + ]) return filteredFacilities.length } diff --git a/src/lib/hooks/useMaplibreMap.ts b/src/lib/hooks/useMaplibreMap.ts index 9f3386b4..bfefa383 100644 --- a/src/lib/hooks/useMaplibreMap.ts +++ b/src/lib/hooks/useMaplibreMap.ts @@ -10,8 +10,10 @@ export function useMaplibreMap(config: { minZoom: number }): Map | null { const map = useRef(null) + const mapIsInitialized = useRef(false) // Map setup (run only once on initial render) useEffect(() => { + if (mapIsInitialized.current) return // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore map.current = new Map({ @@ -24,6 +26,7 @@ export function useMaplibreMap(config: { minZoom: config.minZoom, maxZoom: config.maxZoom, }) + mapIsInitialized.current = true // eslint-disable-next-line react-hooks/exhaustive-deps }, []) From f291cb689667855eada359f3cd7fcf0150b12a41 Mon Sep 17 00:00:00 2001 From: Lucas Vogel Date: Tue, 8 Aug 2023 17:54:39 +0200 Subject: [PATCH 24/76] feat(ActiveFiltersList): Show the text search and categories in the list view --- package-lock.json | 355 ++++++++------------------- package.json | 1 + pages/map.tsx | 40 ++- src/components/ActiveFiltersList.tsx | 60 +++++ src/components/FiltersList.tsx | 4 +- src/components/TextSearch.tsx | 56 ++--- tailwind.config.js | 1 + 7 files changed, 209 insertions(+), 308 deletions(-) create mode 100644 src/components/ActiveFiltersList.tsx diff --git a/package-lock.json b/package-lock.json index f62c20ea..8b522bf1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "1.7.0", "dependencies": { "@headlessui/react": "1.7.8", + "@tailwindcss/container-queries": "0.1.1", "date-fns": "2.29.3", "maplibre-gl": "2.4.0", "next": "13.4.12", @@ -76,7 +77,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, "engines": { "node": ">=10" }, @@ -602,7 +602,7 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, + "devOptional": true, "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -614,7 +614,7 @@ "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, + "devOptional": true, "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -2098,7 +2098,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, "engines": { "node": ">=6.0.0" } @@ -2107,7 +2106,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, "engines": { "node": ">=6.0.0" } @@ -2115,14 +2113,12 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.17", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dev": true, "dependencies": { "@jridgewell/resolve-uri": "3.1.0", "@jridgewell/sourcemap-codec": "1.4.14" @@ -2337,7 +2333,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -2350,7 +2345,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, "engines": { "node": ">= 8" } @@ -2359,7 +2353,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -2800,6 +2793,14 @@ "tslib": "^2.4.0" } }, + "node_modules/@tailwindcss/container-queries": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/container-queries/-/container-queries-0.1.1.tgz", + "integrity": "sha512-p18dswChx6WnTSaJCSGx6lTmrGzNNvm2FtXmiO6AuA1V4U5REyoqwmT6kgAsIMdjo07QdAfYXHJ4hnMtfHzWgA==", + "peerDependencies": { + "tailwindcss": ">=3.2.0" + } + }, "node_modules/@tailwindcss/line-clamp": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/@tailwindcss/line-clamp/-/line-clamp-0.4.4.tgz", @@ -7381,25 +7382,25 @@ "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true + "devOptional": true }, "node_modules/@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true + "devOptional": true }, "node_modules/@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true + "devOptional": true }, "node_modules/@tsconfig/node16": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true + "devOptional": true }, "node_modules/@types/aria-query": { "version": "5.0.1", @@ -7588,7 +7589,7 @@ "version": "18.17.1", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.1.tgz", "integrity": "sha512-xlR1jahfizdplZYRU59JlUx9uzF1ARa8jbhM11ccpCJya8kvos5jwdm2ZAgxSCwOl0fq21svP18EVwPBXMQudw==", - "dev": true + "devOptional": true }, "node_modules/@types/node-fetch": { "version": "2.6.4", @@ -8035,7 +8036,7 @@ "version": "8.10.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true, + "devOptional": true, "bin": { "acorn": "bin/acorn" }, @@ -8169,14 +8170,12 @@ "node_modules/any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" }, "node_modules/anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -8188,8 +8187,7 @@ "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" }, "node_modules/argparse": { "version": "2.0.1", @@ -8631,8 +8629,7 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/before-after-hook": { "version": "2.2.3", @@ -8653,7 +8650,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, "engines": { "node": ">=8" } @@ -8686,7 +8682,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -8696,7 +8691,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -8814,7 +8808,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true, "engines": { "node": ">= 6" } @@ -8895,7 +8888,6 @@ "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, "funding": [ { "type": "individual", @@ -8922,7 +8914,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -9050,8 +9041,7 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/config-chain": { "version": "1.1.13", @@ -9164,7 +9154,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true + "devOptional": true }, "node_modules/cross-fetch": { "version": "3.1.5", @@ -9296,7 +9286,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, "bin": { "cssesc": "bin/cssesc" }, @@ -9745,14 +9734,13 @@ "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" }, "node_modules/diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, + "devOptional": true, "engines": { "node": ">=0.3.1" } @@ -9781,8 +9769,7 @@ "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" }, "node_modules/doctrine": { "version": "3.0.0", @@ -10903,7 +10890,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -10919,7 +10905,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -10943,7 +10928,6 @@ "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, "dependencies": { "reusify": "^1.0.4" } @@ -10988,7 +10972,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -11129,14 +11112,12 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -11149,8 +11130,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/function.prototype.name": { "version": "1.1.5", @@ -11327,7 +11307,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, "dependencies": { "is-glob": "^4.0.3" }, @@ -11465,7 +11444,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" }, @@ -11744,7 +11722,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -11753,8 +11730,7 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { "version": "1.3.8", @@ -11843,7 +11819,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -11883,7 +11858,6 @@ "version": "2.12.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", - "dev": true, "dependencies": { "has": "^1.0.3" }, @@ -11925,7 +11899,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -11952,7 +11925,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -12003,7 +11975,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "engines": { "node": ">=0.12.0" } @@ -15064,7 +15035,6 @@ "version": "1.18.2", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz", "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==", - "dev": true, "bin": { "jiti": "bin/jiti.js" } @@ -15313,7 +15283,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true, "engines": { "node": ">=10" } @@ -15321,8 +15290,7 @@ "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/load-json-file": { "version": "4.0.0", @@ -15487,7 +15455,7 @@ "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true + "devOptional": true }, "node_modules/makeerror": { "version": "1.0.12", @@ -15666,7 +15634,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, "engines": { "node": ">= 8" } @@ -15675,7 +15642,6 @@ "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -15739,7 +15705,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -15793,7 +15758,6 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", @@ -16011,7 +15975,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -18637,7 +18600,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -18646,7 +18608,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true, "engines": { "node": ">= 6" } @@ -18780,7 +18741,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "dependencies": { "wrappy": "1" } @@ -18992,7 +18952,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -19009,8 +18968,7 @@ "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", @@ -19042,7 +19000,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -19063,7 +19020,6 @@ "version": "4.0.5", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "dev": true, "engines": { "node": ">= 6" } @@ -19243,7 +19199,6 @@ "version": "15.1.0", "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", @@ -19260,7 +19215,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, "dependencies": { "camelcase-css": "^2.0.1" }, @@ -19279,7 +19233,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", - "dev": true, "dependencies": { "lilconfig": "^2.0.5", "yaml": "^2.1.1" @@ -19308,7 +19261,6 @@ "version": "2.2.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz", "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==", - "dev": true, "engines": { "node": ">= 14" } @@ -19317,7 +19269,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", - "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.11" }, @@ -19336,7 +19287,6 @@ "version": "6.0.13", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dev": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -19361,8 +19311,7 @@ "node_modules/postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, "node_modules/potpack": { "version": "1.0.2", @@ -19519,7 +19468,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, "funding": [ { "type": "github", @@ -19606,7 +19554,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, "dependencies": { "pify": "^2.3.0" } @@ -19615,7 +19562,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -19774,7 +19720,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -19858,7 +19803,6 @@ "version": "1.22.2", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dev": true, "dependencies": { "is-core-module": "^2.11.0", "path-parse": "^1.0.7", @@ -19940,7 +19884,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -19980,7 +19923,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "funding": [ { "type": "github", @@ -20640,7 +20582,6 @@ "version": "3.32.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.32.0.tgz", "integrity": "sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==", - "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", @@ -20662,7 +20603,6 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -20676,7 +20616,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, "engines": { "node": ">= 6" } @@ -20685,7 +20624,6 @@ "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -20759,7 +20697,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" }, @@ -20848,7 +20785,6 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", - "dev": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -20885,7 +20821,6 @@ "version": "6.0.13", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dev": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -20992,7 +20927,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, "dependencies": { "any-promise": "^1.0.0" } @@ -21001,7 +20935,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, "dependencies": { "thenify": ">= 3.1.0 < 4" }, @@ -21074,7 +21007,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -21139,14 +21071,13 @@ "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" }, "node_modules/ts-node": { "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, + "devOptional": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -21189,7 +21120,7 @@ "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, + "devOptional": true, "engines": { "node": ">=0.4.0" } @@ -21198,7 +21129,7 @@ "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true + "devOptional": true }, "node_modules/tsconfig-paths": { "version": "3.14.2", @@ -21442,7 +21373,7 @@ "version": "4.9.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true, + "devOptional": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -21588,14 +21519,13 @@ "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 + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true + "devOptional": true }, "node_modules/v8-to-istanbul": { "version": "9.0.1", @@ -21850,8 +21780,7 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/write-file-atomic": { "version": "4.0.2", @@ -21975,7 +21904,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, + "devOptional": true, "engines": { "node": ">=6" } @@ -22017,8 +21946,7 @@ "@alloc/quick-lru": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==" }, "@ampproject/remapping": { "version": "2.2.0", @@ -22407,7 +22335,7 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, + "devOptional": true, "requires": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -22416,7 +22344,7 @@ "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, + "devOptional": true, "requires": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -23547,26 +23475,22 @@ "@jridgewell/resolve-uri": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" }, "@jridgewell/set-array": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" }, "@jridgewell/sourcemap-codec": { "version": "1.4.14", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" }, "@jridgewell/trace-mapping": { "version": "0.3.17", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dev": true, "requires": { "@jridgewell/resolve-uri": "3.1.0", "@jridgewell/sourcemap-codec": "1.4.14" @@ -23691,7 +23615,6 @@ "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, "requires": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -23700,14 +23623,12 @@ "@nodelib/fs.stat": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" }, "@nodelib/fs.walk": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, "requires": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -24052,6 +23973,12 @@ "tslib": "^2.4.0" } }, + "@tailwindcss/container-queries": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/container-queries/-/container-queries-0.1.1.tgz", + "integrity": "sha512-p18dswChx6WnTSaJCSGx6lTmrGzNNvm2FtXmiO6AuA1V4U5REyoqwmT6kgAsIMdjo07QdAfYXHJ4hnMtfHzWgA==", + "requires": {} + }, "@tailwindcss/line-clamp": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/@tailwindcss/line-clamp/-/line-clamp-0.4.4.tgz", @@ -27156,25 +27083,25 @@ "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true + "devOptional": true }, "@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true + "devOptional": true }, "@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true + "devOptional": true }, "@tsconfig/node16": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true + "devOptional": true }, "@types/aria-query": { "version": "5.0.1", @@ -27353,7 +27280,7 @@ "version": "18.17.1", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.1.tgz", "integrity": "sha512-xlR1jahfizdplZYRU59JlUx9uzF1ARa8jbhM11ccpCJya8kvos5jwdm2ZAgxSCwOl0fq21svP18EVwPBXMQudw==", - "dev": true + "devOptional": true }, "@types/node-fetch": { "version": "2.6.4", @@ -27676,7 +27603,7 @@ "version": "8.10.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", - "dev": true + "devOptional": true }, "acorn-globals": { "version": "6.0.0", @@ -27773,14 +27700,12 @@ "any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" }, "anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -27789,8 +27714,7 @@ "arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", - "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", - "dev": true + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" }, "argparse": { "version": "2.0.1", @@ -28115,8 +28039,7 @@ "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "before-after-hook": { "version": "2.2.3", @@ -28133,8 +28056,7 @@ "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" }, "boolbase": { "version": "1.0.0", @@ -28161,7 +28083,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -28171,7 +28092,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "requires": { "fill-range": "^7.0.1" } @@ -28251,8 +28171,7 @@ "camelcase-css": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", - "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", - "dev": true + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" }, "camelcase-keys": { "version": "6.2.2", @@ -28301,7 +28220,6 @@ "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, "requires": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -28317,7 +28235,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "requires": { "is-glob": "^4.0.1" } @@ -28423,8 +28340,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "config-chain": { "version": "1.1.13", @@ -28516,7 +28432,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true + "devOptional": true }, "cross-fetch": { "version": "3.1.5", @@ -28620,8 +28536,7 @@ "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 + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" }, "csso": { "version": "4.2.0", @@ -28939,14 +28854,13 @@ "didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", - "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", - "dev": true + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" }, "diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true + "devOptional": true }, "diff-sequences": { "version": "29.2.0", @@ -28966,8 +28880,7 @@ "dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", - "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", - "dev": true + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" }, "doctrine": { "version": "3.0.0", @@ -29800,7 +29713,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -29813,7 +29725,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "requires": { "is-glob": "^4.0.1" } @@ -29836,7 +29747,6 @@ "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, "requires": { "reusify": "^1.0.4" } @@ -29872,7 +29782,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "requires": { "to-regex-range": "^5.0.1" } @@ -29968,21 +29877,18 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, "optional": true }, "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==" }, "function.prototype.name": { "version": "1.1.5", @@ -30119,7 +30025,6 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, "requires": { "is-glob": "^4.0.3" } @@ -30221,7 +30126,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" } @@ -30398,7 +30302,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -30407,8 +30310,7 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { "version": "1.3.8", @@ -30476,7 +30378,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, "requires": { "binary-extensions": "^2.0.0" } @@ -30501,7 +30402,6 @@ "version": "2.12.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", - "dev": true, "requires": { "has": "^1.0.3" } @@ -30524,8 +30424,7 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" }, "is-fullwidth-code-point": { "version": "3.0.0", @@ -30543,7 +30442,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "requires": { "is-extglob": "^2.1.1" } @@ -30572,8 +30470,7 @@ "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "is-number-object": { "version": "1.0.7", @@ -32869,8 +32766,7 @@ "jiti": { "version": "1.18.2", "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz", - "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==", - "dev": true + "integrity": "sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==" }, "js-tokens": { "version": "4.0.0", @@ -33062,14 +32958,12 @@ "lilconfig": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==" }, "lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "load-json-file": { "version": "4.0.0", @@ -33206,7 +33100,7 @@ "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true + "devOptional": true }, "makeerror": { "version": "1.0.12", @@ -33339,14 +33233,12 @@ "merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" }, "micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, "requires": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -33389,7 +33281,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -33431,7 +33322,6 @@ "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, "requires": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", @@ -33583,8 +33473,7 @@ "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "normalize-range": { "version": "0.1.2", @@ -35414,14 +35303,12 @@ "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" }, "object-hash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", - "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", - "dev": true + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==" }, "object-inspect": { "version": "1.12.3", @@ -35516,7 +35403,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "requires": { "wrappy": "1" } @@ -35664,8 +35550,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" }, "path-key": { "version": "3.1.1", @@ -35676,8 +35561,7 @@ "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", @@ -35702,8 +35586,7 @@ "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, "pify": { "version": "3.0.0", @@ -35714,8 +35597,7 @@ "pirates": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", - "dev": true + "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==" }, "pkg-conf": { "version": "2.1.0", @@ -35840,7 +35722,6 @@ "version": "15.1.0", "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", - "dev": true, "requires": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", @@ -35851,7 +35732,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", - "dev": true, "requires": { "camelcase-css": "^2.0.1" } @@ -35860,7 +35740,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", - "dev": true, "requires": { "lilconfig": "^2.0.5", "yaml": "^2.1.1" @@ -35869,8 +35748,7 @@ "yaml": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz", - "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==", - "dev": true + "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==" } } }, @@ -35878,7 +35756,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", - "dev": true, "requires": { "postcss-selector-parser": "^6.0.11" }, @@ -35887,7 +35764,6 @@ "version": "6.0.13", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dev": true, "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -35908,8 +35784,7 @@ "postcss-value-parser": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, "potpack": { "version": "1.0.2", @@ -36035,8 +35910,7 @@ "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" }, "quick-lru": { "version": "4.0.1", @@ -36096,7 +35970,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, "requires": { "pify": "^2.3.0" }, @@ -36104,8 +35977,7 @@ "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" } } }, @@ -36236,7 +36108,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, "requires": { "picomatch": "^2.2.1" } @@ -36302,7 +36173,6 @@ "version": "1.22.2", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dev": true, "requires": { "is-core-module": "^2.11.0", "path-parse": "^1.0.7", @@ -36361,8 +36231,7 @@ "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" }, "rimraf": { "version": "3.0.2", @@ -36386,7 +36255,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "requires": { "queue-microtask": "^1.2.2" } @@ -36903,7 +36771,6 @@ "version": "3.32.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.32.0.tgz", "integrity": "sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==", - "dev": true, "requires": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", @@ -36918,7 +36785,6 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, "requires": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -36928,14 +36794,12 @@ "commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" }, "glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -36994,8 +36858,7 @@ "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==" }, "svgo": { "version": "2.8.0", @@ -37049,7 +36912,6 @@ "version": "3.3.3", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", - "dev": true, "requires": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -37079,7 +36941,6 @@ "version": "6.0.13", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", - "dev": true, "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -37157,7 +37018,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, "requires": { "any-promise": "^1.0.0" } @@ -37166,7 +37026,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, "requires": { "thenify": ">= 3.1.0 < 4" } @@ -37226,7 +37085,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "requires": { "is-number": "^7.0.0" } @@ -37275,14 +37133,13 @@ "ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" }, "ts-node": { "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, + "devOptional": true, "requires": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -37303,13 +37160,13 @@ "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true + "devOptional": true }, "arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true + "devOptional": true } } }, @@ -37498,7 +37355,7 @@ "version": "4.9.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true + "devOptional": true }, "uglify-js": { "version": "3.17.4", @@ -37596,14 +37453,13 @@ "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 + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true + "devOptional": true }, "v8-to-istanbul": { "version": "9.0.1", @@ -37802,8 +37658,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "write-file-atomic": { "version": "4.0.2", @@ -37891,7 +37746,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true + "devOptional": true }, "yocto-queue": { "version": "0.1.0", diff --git a/package.json b/package.json index d9f0b37b..cb8a2850 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ }, "dependencies": { "@headlessui/react": "1.7.8", + "@tailwindcss/container-queries": "0.1.1", "date-fns": "2.29.3", "maplibre-gl": "2.4.0", "next": "13.4.12", diff --git a/pages/map.tsx b/pages/map.tsx index 21a21a7f..b431c7ed 100644 --- a/pages/map.tsx +++ b/pages/map.tsx @@ -13,9 +13,9 @@ import { useDistanceToUser } from '@lib/hooks/useDistanceToUser' import { useUserGeolocation } from '@lib/hooks/useUserGeolocation' import { useFiltersWithActiveProp } from '@lib/hooks/useFiltersWithActiveProp' import { getFilteredFacilities } from '@lib/facilityFilterUtil' -import { Button } from '@components/Button' import { FacilityListItem } from '@components/FacilityListItem' import { useActiveIdsBySearchTerm } from '@lib/hooks/useActiveIdsBySearchTerm' +import ActiveFiltersList from '@components/ActiveFiltersList' export const getStaticProps: GetStaticProps = async () => { const { texts, labels, records } = await loadData() @@ -122,35 +122,23 @@ const MapPage: Page = ({ records: originalRecords }) => { : `${texts.resultPageTitle} – ${texts.siteTitle}`} - {labels.filter((label) => label.isActive).length > 0 && ( + + + {filteredRecords.length === 0 && (
-

{texts.resultPageIntro}

-
    - {labels - .filter((label) => label.isActive) - .map((label) => ( - - ))} -
+

{texts.noResults}

)} -
    - {filteredRecords.map((record) => ( -
  • - -
  • - ))} -
+ {filteredRecords.length > 0 && ( +
    + {filteredRecords.map((record) => ( +
  • + +
  • + ))} +
+ )} ) } diff --git a/src/components/ActiveFiltersList.tsx b/src/components/ActiveFiltersList.tsx new file mode 100644 index 00000000..52191ad3 --- /dev/null +++ b/src/components/ActiveFiltersList.tsx @@ -0,0 +1,60 @@ +import { useTexts } from '@lib/TextsContext' +import { useFiltersWithActiveProp } from '@lib/hooks/useFiltersWithActiveProp' +import React from 'react' +import { getCategoriesTexts } from './TextSearch' +import { + urlSearchCategoriesToStateSearchCategories, + useUrlState, +} from '@lib/UrlStateContext' +import { GristLabelType } from '@common/types/gristData' +import { Button } from './Button' + +function ActiveFiltersList(): JSX.Element | null { + const texts = useTexts() + const [urlState] = useUrlState() + const labels = useFiltersWithActiveProp() + const categoriesTexts = getCategoriesTexts(texts) + const categoriesCount = Object.keys(categoriesTexts).length + const categories = urlSearchCategoriesToStateSearchCategories( + urlState.qCategories + ) + + const categoryFilters = Object.entries(categories) + .filter(([, isActive]) => isActive) + .map(([key]) => ({ + id: key, + fields: { + text: categoriesTexts[key as keyof typeof categoriesTexts], + }, + })) + + const allFilters = [ + ...(urlState.q ? [{ id: 'search', fields: { text: urlState.q } }] : []), + ...(categoryFilters.length < categoriesCount ? categoryFilters : []), + ...labels.filter((label) => label.isActive), + ] as GristLabelType[] + + if (allFilters.length === 0) return null + + return ( +
+

{texts.resultPageIntro}

+
    + {allFilters.map((label) => ( + + ))} +
+
+ ) +} + +export default ActiveFiltersList diff --git a/src/components/FiltersList.tsx b/src/components/FiltersList.tsx index 3b84682a..8d2d60b7 100644 --- a/src/components/FiltersList.tsx +++ b/src/components/FiltersList.tsx @@ -96,7 +96,7 @@ export const FiltersList: FC<{ } return ( -
+
    -
    +
    ) => void } +type CategoriesTextMapType = Record + function TextSearch({ text: initialText, categories, @@ -31,43 +33,25 @@ function TextSearch({ setText(initialText || '') }, [initialText]) - const checkboxes = [ - { - id: 'categorySelfHelp', - labelText: texts.textSearchCategorySelfHelp, - }, - { - id: 'categoryAdvising', - labelText: texts.textSearchCategoryAdvising, - }, - { - id: 'categoryClinics', - labelText: texts.textSearchCategoryClinics, - }, - { - id: 'categoryOnlineOffers', - labelText: texts.textSearchCategoryOnlineOffers, - }, - { - id: 'categoryDisctrictOfficeHelp', - labelText: texts.textSearchCategoryDisctrictOfficeHelp, - }, - ] + const categoriesTexts = getCategoriesTexts(texts) + const checkboxes = Object.keys(categoriesTexts).map((categoryKey) => ({ + id: categoryKey, + labelText: categoriesTexts[categoryKey as keyof CategoriesTextMapType], + })) return ( -
    +
    { - setText(evt.target.value) - }} - onBlur={() => { - onChange({ categories, text }) - }} + onChange={(evt) => setText(evt.target.value)} + onBlur={() => onChange({ categories, text })} onKeyDown={(evt) => { if (evt.key === 'Enter') { onChange({ categories, text }) @@ -103,4 +87,16 @@ function TextSearch({ ) } +export const getCategoriesTexts = ( + texts: TextsMapType +): CategoriesTextMapType => { + return { + categorySelfHelp: texts.textSearchCategorySelfHelp, + categoryAdvising: texts.textSearchCategoryAdvising, + categoryClinics: texts.textSearchCategoryClinics, + categoryOnlineOffers: texts.textSearchCategoryOnlineOffers, + categoryDisctrictOfficeHelp: texts.textSearchCategoryDisctrictOfficeHelp, + } +} + export default TextSearch diff --git a/tailwind.config.js b/tailwind.config.js index f9d647d4..6ab71e7a 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -67,5 +67,6 @@ module.exports = { plugins: [ require('@tailwindcss/line-clamp'), require('@tailwindcss/typography'), + require('@tailwindcss/container-queries'), ], } From c17aa3b632de5f65b4b621e3e82224b808fa7daa Mon Sep 17 00:00:00 2001 From: Lucas Vogel Date: Wed, 9 Aug 2023 13:42:34 +0200 Subject: [PATCH 25/76] refactor(useActiveIdsBySearchTerm): Show all items for first two categories by default And remove logic that reactivates all categories when none is selected anymore as discussed with @esshahn --- pages/api/search.ts | 6 +-- src/components/ActiveFiltersList.tsx | 3 +- src/components/Button.tsx | 7 +-- src/components/FiltersList.tsx | 52 ++++++++++++--------- src/components/TextSearch.tsx | 19 +++----- src/lib/TextsContext.tsx | 1 + src/lib/UrlStateContext.tsx | 31 ++++++++---- src/lib/hooks/useActiveIdsBySearchTerm.ts | 41 ++++++++++------ src/lib/hooks/useFilteredFacilitiesCount.ts | 2 +- 9 files changed, 96 insertions(+), 66 deletions(-) diff --git a/pages/api/search.ts b/pages/api/search.ts index bd0a6c69..ada4ef71 100644 --- a/pages/api/search.ts +++ b/pages/api/search.ts @@ -13,8 +13,8 @@ const searchData = ({ query: string filters: string[] }): TableRowType[] => { - if ((!query && filters.length === 0) || (!query && filters.length === 5)) - return data + if (filters.length === 0) return [] + if (!query && filters.length === 5) return data return data.filter((item) => { // check if item.fields.Typ is in the filters array if (filters.length > 0 && !filters.includes(item.fields.Typ)) { @@ -85,7 +85,7 @@ const handler = async ( const content = await fs.readFile(filePath, 'utf8') const data = JSON.parse(content) as TableRowType[] const result = searchData({ data, query: params.query, filters }) - return res.status(200).json({ params, result }) + return res.status(200).json({ params, result, total: data.length }) } catch (error: unknown) { if (error instanceof Error) { return res.status(500).json({ result: null, error: error.message }) diff --git a/src/components/ActiveFiltersList.tsx b/src/components/ActiveFiltersList.tsx index 52191ad3..57cd0a42 100644 --- a/src/components/ActiveFiltersList.tsx +++ b/src/components/ActiveFiltersList.tsx @@ -14,7 +14,6 @@ function ActiveFiltersList(): JSX.Element | null { const [urlState] = useUrlState() const labels = useFiltersWithActiveProp() const categoriesTexts = getCategoriesTexts(texts) - const categoriesCount = Object.keys(categoriesTexts).length const categories = urlSearchCategoriesToStateSearchCategories( urlState.qCategories ) @@ -30,7 +29,7 @@ function ActiveFiltersList(): JSX.Element | null { const allFilters = [ ...(urlState.q ? [{ id: 'search', fields: { text: urlState.q } }] : []), - ...(categoryFilters.length < categoriesCount ? categoryFilters : []), + ...categoryFilters, ...labels.filter((label) => label.isActive), ] as GristLabelType[] diff --git a/src/components/Button.tsx b/src/components/Button.tsx index ad5b12db..be4dce23 100644 --- a/src/components/Button.tsx +++ b/src/components/Button.tsx @@ -61,7 +61,7 @@ export const Button: FC = ({ ) const SHARED_CLASSES = classNames( - 'text-center', + 'text-center group', 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2 focus-visible:ring-offset-white', SIZE_CLASSES, SCHEME_CLASSES, @@ -120,9 +120,10 @@ export const Button: FC = ({ {tooltip && ( {tooltip} diff --git a/src/components/FiltersList.tsx b/src/components/FiltersList.tsx index 8d2d60b7..1fa23d7b 100644 --- a/src/components/FiltersList.tsx +++ b/src/components/FiltersList.tsx @@ -5,7 +5,7 @@ import { useUrlState, } from '@lib/UrlStateContext' import { useUserGeolocation } from '@lib/hooks/useUserGeolocation' -import { useTexts } from '@lib/TextsContext' +import { TextsMapType, useTexts } from '@lib/TextsContext' import { FC, useEffect, useMemo, useState } from 'react' import { SwitchButton } from './SwitchButton' import { useRouter } from 'next/router' @@ -19,6 +19,7 @@ import { Listbox } from './Listbox' import { Button } from './Button' import { Arrow } from './icons/Arrow' import TextSearch from './TextSearch' +import { useActiveIdsBySearchTerm } from '@lib/hooks/useActiveIdsBySearchTerm' export const FiltersList: FC<{ recordsWithOnlyLabels: RecordsWithOnlyLabelsType[] @@ -42,6 +43,7 @@ export const FiltersList: FC<{ const filteredFacilitiesCount = useFilteredFacilitiesCount( recordsWithOnlyLabels ) + const { isLoading: textSearchLoading, total } = useActiveIdsBySearchTerm() const group1 = labels.filter(({ fields }) => fields.group2 === 'gruppe-1') const group2 = labels.filter(({ fields }) => fields.group2 === 'gruppe-2') @@ -79,25 +81,9 @@ export const FiltersList: FC<{ updateUrlState({ tags: newTags }) } - const getSubmitText = (): string => { - switch (filteredFacilitiesCount) { - case recordsWithOnlyLabels.length: - return texts.filtersButtonTextAllFilters - case 1: - return texts.filtersButtonTextFilteredSingular - case 0: - return texts.filtersButtonTextFilteredNoResults - default: - return texts.filtersButtonTextFilteredPlural.replace( - '#number', - `${filteredFacilitiesCount}` - ) - } - } - return (
    -
    +
      { onSubmit() void push({ @@ -225,16 +211,38 @@ export const FiltersList: FC<{ )} /> } - disabled={queryTagIds.length > 0 && filteredFacilitiesCount === 0} + disabled={filteredFacilitiesCount === 0} tooltip={ - queryTagIds.length > 0 && filteredFacilitiesCount === 0 && ( {texts.filtersButtonTextFilteredNoResultsHint} ) } > - {getSubmitText()} + {getSubmitText({ + texts, + isLoading: textSearchLoading, + count: filteredFacilitiesCount, + total, + })}
    ) } + +function getSubmitText({ + texts, + isLoading = false, + count, + total, +}: { + texts: TextsMapType + isLoading?: boolean + count: number + total: number +}): string { + if (isLoading) return texts.filtersButtonLoading + if (count === 0) return texts.filtersButtonTextFilteredNoResults + if (count === 1) return texts.filtersButtonTextFilteredSingular + if (count === total) return texts.filtersButtonTextAllFilters + return texts.filtersButtonTextFilteredPlural.replace('#number', `${count}`) +} diff --git a/src/components/TextSearch.tsx b/src/components/TextSearch.tsx index 51c01ee8..2cdd485f 100644 --- a/src/components/TextSearch.tsx +++ b/src/components/TextSearch.tsx @@ -65,20 +65,13 @@ function TextSearch({ id={id} labelText={labelText} onChange={(evt) => { - const checked = evt.target.checked - const newCategories = { ...categories, [id]: checked } - const allUnchecked = Object.values(newCategories).every( - (value) => !value - ) - const allChecked = Object.keys(categories).reduce( - (acc, key) => ({ ...acc, [key]: true }), - {} - ) - const allWhenAllUnchecked = { - categories: allUnchecked ? allChecked : newCategories, + onChange({ text, - } - onChange(allWhenAllUnchecked) + categories: { + ...categories, + [id]: evt.target.checked, + }, + }) }} checked={!!categories[id as keyof CategoriesType]} /> diff --git a/src/lib/TextsContext.tsx b/src/lib/TextsContext.tsx index a5b99134..deea9d52 100644 --- a/src/lib/TextsContext.tsx +++ b/src/lib/TextsContext.tsx @@ -126,6 +126,7 @@ const defaultValue = { textSearchCategoryOnlineOffers: '', textSearchCategoryDisctrictOfficeHelp: '', optionalFurtherSearchIntroText: '', + filtersButtonLoading: '', } export type TextsMapType = typeof defaultValue diff --git a/src/lib/UrlStateContext.tsx b/src/lib/UrlStateContext.tsx index 4125bf38..65cddcc5 100644 --- a/src/lib/UrlStateContext.tsx +++ b/src/lib/UrlStateContext.tsx @@ -1,5 +1,5 @@ import { useRouter } from 'next/router' -import { createContext, FC, useCallback, useContext } from 'react' +import { createContext, FC, useCallback, useContext, useEffect } from 'react' import { mapRawQueryToState, PageQueryType } from './mapRawQueryToState' type ParsedSearchTermCategoriesType = { @@ -44,27 +44,40 @@ export const UrlStateProvider: FC = ({ children }) => { [query, pathname, push] ) + useEffect(() => { + if (typeof window === 'undefined') return + const urlParams = new URLSearchParams(window.location.search) + if (urlParams.get('qCategories')) return + updateUrlState({ + ...query, + qCategories: stateSearchCategoriesToUrlSearchCategories({ + categorySelfHelp: true, + categoryAdvising: true, + }), + }) + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []) + return {children} } export function urlSearchCategoriesToStateSearchCategories( qCategories: PageQueryType['qCategories'] ): Partial { - const noCategories = !qCategories || qCategories.length === 0 return { - categorySelfHelp: noCategories || qCategories.includes(1), - categoryAdvising: noCategories || qCategories.includes(2), - categoryClinics: noCategories || qCategories.includes(3), - categoryDisctrictOfficeHelp: noCategories || qCategories.includes(4), - categoryOnlineOffers: noCategories || qCategories.includes(5), + categorySelfHelp: !!qCategories?.includes(1), + categoryAdvising: !!qCategories?.includes(2), + categoryClinics: !!qCategories?.includes(3), + categoryDisctrictOfficeHelp: !!qCategories?.includes(4), + categoryOnlineOffers: !!qCategories?.includes(5), } } export function stateSearchCategoriesToUrlSearchCategories( searchTermCategories: Partial | undefined ): PageQueryType['qCategories'] { - if (!searchTermCategories) return undefined - if (Object.entries(searchTermCategories).length === 0) return undefined + if (typeof searchTermCategories === 'undefined') return undefined + if (Object.entries(searchTermCategories).length === 0) return [] return [ searchTermCategories.categorySelfHelp && 1, searchTermCategories.categoryAdvising && 2, diff --git a/src/lib/hooks/useActiveIdsBySearchTerm.ts b/src/lib/hooks/useActiveIdsBySearchTerm.ts index bb106f01..b39d47f8 100644 --- a/src/lib/hooks/useActiveIdsBySearchTerm.ts +++ b/src/lib/hooks/useActiveIdsBySearchTerm.ts @@ -8,14 +8,23 @@ import { MinimalRecordType } from '@lib/mapRecordToMinimum' import { useEffect, useState } from 'react' import useSWR from 'swr' -interface SearchResult { - result?: TableRowType[] - error?: string +interface SearchResultBase { params: Record } +interface SearchResultSuccess extends SearchResultBase { + result: TableRowType[] + total: number +} + +interface SearchResultError extends SearchResultBase { + error: string +} + +export type SearchResult = SearchResultSuccess | SearchResultError interface UseActiveIdsBySearchTermReturnType { ids: MinimalRecordType['id'][] | null + total: number isLoading: boolean key: string } @@ -24,33 +33,38 @@ export const useActiveIdsBySearchTerm = (): UseActiveIdsBySearchTermReturnType => { const [urlState] = useUrlState() const [ids, setIds] = useState(null) - const q = urlState.q || null - const qCategories = urlState.qCategories || null + const [total, setTotal] = useState(10000) + const q = urlState.q ?? null + const qCategories = urlState.qCategories ?? null const key = `search-${q || 'empty'}-${qCategories?.join('-') || 'empty'}` const { data, isLoading } = useSWR(key, async () => - searchRecords(q, qCategories) + searchRecords(q, qCategories, total) ) useEffect(() => { - if (!data?.result) return - setIds(data.result.map((r) => r.id)) - }, [data]) + if (isLoading || !data || 'error' in data) return + setIds(data.result?.map((r) => r.id) || []) + setTotal(data.total) + }, [data, isLoading]) return { ids, isLoading, + total, key: ids?.join('-') || 'empty', } } async function searchRecords( q: string | null, - qCategories: PageQueryType['qCategories'] | null + qCategories: PageQueryType['qCategories'] | null, + total: number ): Promise { - if (q === null && qCategories === null) return { params: {} } + if (q === null && qCategories === null) + return { params: {}, result: [], total } const url = new URLSearchParams({ query: q || '', - filters: qCategories ? categoriesToFilterString(qCategories) : '', + filters: categoriesToFilterString(qCategories), }) const response = await fetch(`/api/search?${url.toString()}`) if (!response.ok) throw new Error(await response.text()) @@ -58,8 +72,9 @@ async function searchRecords( } function categoriesToFilterString( - categories: PageQueryType['qCategories'] + categories: PageQueryType['qCategories'] | null ): string { + if (categories === null) return '' const categoriesState = urlSearchCategoriesToStateSearchCategories(categories) return [ categoriesState.categoryAdvising && 'Beratung', diff --git a/src/lib/hooks/useFilteredFacilitiesCount.ts b/src/lib/hooks/useFilteredFacilitiesCount.ts index 5683fb95..5d975fe9 100644 --- a/src/lib/hooks/useFilteredFacilitiesCount.ts +++ b/src/lib/hooks/useFilteredFacilitiesCount.ts @@ -38,7 +38,7 @@ export const useFilteredFacilitiesCount = ( }) if (isNotFilteredAtAll) { - setFilteredFacilities(facilitiesWithOnlyLabels) + setFilteredFacilities([]) return } From b12cdc7658500e8da0aedace1195c76b652fa548 Mon Sep 17 00:00:00 2001 From: Lucas Vogel Date: Wed, 9 Aug 2023 15:54:22 +0200 Subject: [PATCH 26/76] refactor(FiltersList): Add loading indication when loading search results --- pages/map.tsx | 3 +- src/components/FiltersList.tsx | 52 ++++++++++++++++++------------ src/components/FiltersTagsList.tsx | 3 ++ src/components/Label.tsx | 20 ++++++++---- src/components/Listbox.tsx | 16 ++++++--- src/components/TextSearch.tsx | 5 +++ src/components/icons/Spinner.tsx | 27 ++++++++++++++++ src/lib/UrlStateContext.tsx | 11 ++++++- 8 files changed, 102 insertions(+), 35 deletions(-) create mode 100644 src/components/icons/Spinner.tsx diff --git a/pages/map.tsx b/pages/map.tsx index b431c7ed..ac8dbc81 100644 --- a/pages/map.tsx +++ b/pages/map.tsx @@ -103,6 +103,7 @@ const MapPage: Page = ({ records: originalRecords }) => { [getDistanceToUser, useGeolocation, defaultSort, sortByTagsCount] ) + const tagsKey = urlState.tags?.join('-') || '' useEffect(() => { const filteredRecords = getFilteredFacilities({ facilities: originalRecords, @@ -111,7 +112,7 @@ const MapPage: Page = ({ records: originalRecords }) => { }) return setFilteredRecords(sortFacilities(filteredRecords)) // eslint-disable-next-line react-hooks/exhaustive-deps - }, [urlState.tags?.join('-'), activeIdsBySearchTerm.key]) + }, [tagsKey, activeIdsBySearchTerm.key, activeIdsBySearchTerm.isLoading]) return ( <> diff --git a/src/components/FiltersList.tsx b/src/components/FiltersList.tsx index 1fa23d7b..cec4f9e9 100644 --- a/src/components/FiltersList.tsx +++ b/src/components/FiltersList.tsx @@ -20,6 +20,7 @@ import { Button } from './Button' import { Arrow } from './icons/Arrow' import TextSearch from './TextSearch' import { useActiveIdsBySearchTerm } from '@lib/hooks/useActiveIdsBySearchTerm' +import { Spinner } from './icons/Spinner' export const FiltersList: FC<{ recordsWithOnlyLabels: RecordsWithOnlyLabelsType[] @@ -44,6 +45,7 @@ export const FiltersList: FC<{ recordsWithOnlyLabels ) const { isLoading: textSearchLoading, total } = useActiveIdsBySearchTerm() + const fieldsDisabled = textSearchLoading const group1 = labels.filter(({ fields }) => fields.group2 === 'gruppe-1') const group2 = labels.filter(({ fields }) => fields.group2 === 'gruppe-2') @@ -57,21 +59,17 @@ export const FiltersList: FC<{ .map((label) => label.id) const [activeTargetGroupId, setActiveTargetGroupId] = useState( - queryTagIds.find((tagId) => { - return targetGroupIds.includes(tagId) - }) + queryTagIds.find((tagId) => targetGroupIds.includes(tagId)) || null ) + const tagsKey = queryTagIds.join('-') useEffect(() => { - if (queryTagIds.length === 0) return - const currentTargetGroupId = queryTagIds.find((tagId) => targetGroupIds.includes(tagId) ) - if (currentTargetGroupId) { - setActiveTargetGroupId(currentTargetGroupId) - } - }, [queryTagIds, targetGroupIds]) + setActiveTargetGroupId(currentTargetGroupId || null) + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [tagsKey, targetGroupIds]) const someGroupFiltersActive = labels .filter(({ fields }) => fields.group2 !== 'zielpublikum') @@ -88,10 +86,12 @@ export const FiltersList: FC<{
{someGroupFiltersActive && ( + +
{checkboxes.map(({ id, labelText }) => ( Date: Wed, 9 Aug 2023 17:07:41 +0200 Subject: [PATCH 28/76] refactor(UrlStateContext): Limit text search length --- src/lib/UrlStateContext.tsx | 5 +++++ src/lib/mapRawQueryToState/index.ts | 4 +++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/lib/UrlStateContext.tsx b/src/lib/UrlStateContext.tsx index 4eea5b1a..950707d4 100644 --- a/src/lib/UrlStateContext.tsx +++ b/src/lib/UrlStateContext.tsx @@ -2,6 +2,8 @@ import { useRouter } from 'next/router' import { createContext, FC, useCallback, useContext, useEffect } from 'react' import { mapRawQueryToState, PageQueryType } from './mapRawQueryToState' +export const MAX_TEXT_SEARCH_STRING_LENGTH = 100 + type ParsedSearchTermCategoriesType = { categorySelfHelp: boolean categoryAdvising: boolean @@ -35,6 +37,9 @@ export const UrlStateProvider: FC = ({ children }) => { query: { ...query, ...newState, + q: newState.q + ? newState.q.slice(0, MAX_TEXT_SEARCH_STRING_LENGTH) + : undefined, }, }, undefined, diff --git a/src/lib/mapRawQueryToState/index.ts b/src/lib/mapRawQueryToState/index.ts index 3144fbb1..1baef55e 100644 --- a/src/lib/mapRawQueryToState/index.ts +++ b/src/lib/mapRawQueryToState/index.ts @@ -1,3 +1,4 @@ +import { MAX_TEXT_SEARCH_STRING_LENGTH } from '@lib/UrlStateContext' import { removeNullAndUndefinedFromQuery } from '@lib/removeNullAndUndefinedFromQuery' type qCategoryType = 1 | 2 | 3 | 4 | 5 @@ -23,7 +24,8 @@ const parseSingleNumber = ( } const parseString = (val: string | string[] | undefined): string | null => { - if (typeof val === 'string') return val + if (typeof val === 'string') + return val.slice(0, MAX_TEXT_SEARCH_STRING_LENGTH) return null } From 6e9b1cbc7cb22c88c9f7ce15360dcd5cfe1a31a2 Mon Sep 17 00:00:00 2001 From: Lucas Vogel Date: Wed, 9 Aug 2023 17:28:06 +0200 Subject: [PATCH 29/76] refactor(MapHeader): Change active class and text of sidebar button --- src/components/MapHeader.tsx | 51 ++++++++++++++++-------------------- src/components/MapLayout.tsx | 2 +- 2 files changed, 23 insertions(+), 30 deletions(-) diff --git a/src/components/MapHeader.tsx b/src/components/MapHeader.tsx index 17ce97e1..02566ff1 100644 --- a/src/components/MapHeader.tsx +++ b/src/components/MapHeader.tsx @@ -1,7 +1,6 @@ import classNames from '@lib/classNames' import { FeatureType } from '@lib/requests/geocode' import { useTexts } from '@lib/TextsContext' -import { useUrlState } from '@lib/UrlStateContext' import { FC } from 'react' import { IconButtonLink } from './IconButton' import { House } from './icons/House' @@ -20,7 +19,6 @@ export const MapHeader: FC = ({ handleSearchResult, listViewOpen, }) => { - const [urlState] = useUrlState() const texts = useTexts() return ( @@ -73,36 +71,31 @@ export const MapHeader: FC = ({
- + + {texts.filterLabel} + + + )}
) diff --git a/src/components/MapLayout.tsx b/src/components/MapLayout.tsx index 61ce82d2..ac5e4b29 100644 --- a/src/components/MapLayout.tsx +++ b/src/components/MapLayout.tsx @@ -186,7 +186,7 @@ export const MapLayout: FC<{ className={classNames( `sticky top-0 flex justify-between font-bold`, `px-5 py-6 bg-white border-b border-gray-10`, - `text-2xl items-center leading-tight` + `text-2xl items-center leading-tight z-10` )} > {texts.filterLabel} From e6f8764baa3e50a9d13ab03f8690e70a78be83ff Mon Sep 17 00:00:00 2001 From: Lucas Vogel Date: Wed, 9 Aug 2023 17:35:55 +0200 Subject: [PATCH 30/76] refactor(MapHeader): Fix styles related to merging the address search removal a --- src/components/MapHeader.tsx | 53 ++++++++++++++---------------------- 1 file changed, 21 insertions(+), 32 deletions(-) diff --git a/src/components/MapHeader.tsx b/src/components/MapHeader.tsx index b30919d6..7b7a0571 100644 --- a/src/components/MapHeader.tsx +++ b/src/components/MapHeader.tsx @@ -30,7 +30,7 @@ export const MapHeader: FC = ({ = ({ : `2xl:translate-x-0` )} > - setFilterSidebarIsOpened(!filterSidebarIsOpened)} className={classNames( - 'flex md:hidden border-r md:rounded-r focus:rounded', - !listViewOpen && - '!border-r-trasparent !focus:border-r-gray-20 rounded-r-none' + `transition motion-reduce:transition-none`, + `flex items-center group relative border-gray-20`, + `focus-visible:border-l focus-visible:z-20 focus-visible:rounded`, + `focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary`, + `focus-visible:ring-offset-2 focus-visible:ring-offset-white`, + filterSidebarIsOpened ? `opacity-0` : `opacity-100` )} - aria-label={texts.backToHome} + tabIndex={filterSidebarIsOpened ? -1 : 0} > - - - - {!filterSidebarIsOpened && ( - - )} + {texts.filterLabel} + +
) From 703694c42f2da598d2fe79f4ce2d8cea63f149b0 Mon Sep 17 00:00:00 2001 From: Lucas Vogel Date: Wed, 9 Aug 2023 17:56:59 +0200 Subject: [PATCH 31/76] fix(TextSearch): Remove class that misaligns buttons on text field --- src/components/TextSearch.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/TextSearch.tsx b/src/components/TextSearch.tsx index 191273d2..9cf080c4 100644 --- a/src/components/TextSearch.tsx +++ b/src/components/TextSearch.tsx @@ -71,7 +71,6 @@ function TextSearch({ Date: Wed, 9 Aug 2023 18:00:16 +0200 Subject: [PATCH 32/76] fix(UrlStateContext): Make sure that the query string isn't lost when filters change --- src/lib/UrlStateContext.tsx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/lib/UrlStateContext.tsx b/src/lib/UrlStateContext.tsx index 950707d4..3238f2c4 100644 --- a/src/lib/UrlStateContext.tsx +++ b/src/lib/UrlStateContext.tsx @@ -31,15 +31,14 @@ export const UrlStateProvider: FC = ({ children }) => { const updateUrlState = useCallback( (newState: PageQueryType) => { const path = typeof query.id === 'string' ? `/${query.id}` : pathname + const q = newState.q || query.q void push( { pathname: path, query: { ...query, ...newState, - q: newState.q - ? newState.q.slice(0, MAX_TEXT_SEARCH_STRING_LENGTH) - : undefined, + q: q ? q.slice(0, MAX_TEXT_SEARCH_STRING_LENGTH) : undefined, }, }, undefined, From 36962f743c6d3e30a68ffbe420764d3501bae84d Mon Sep 17 00:00:00 2001 From: Lucas Vogel Date: Wed, 9 Aug 2023 18:03:00 +0200 Subject: [PATCH 33/76] fix(UrlStateContext): use ?? instead of pipe to avoid falsy values to be ignored --- src/lib/UrlStateContext.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/UrlStateContext.tsx b/src/lib/UrlStateContext.tsx index 3238f2c4..98c29769 100644 --- a/src/lib/UrlStateContext.tsx +++ b/src/lib/UrlStateContext.tsx @@ -31,7 +31,7 @@ export const UrlStateProvider: FC = ({ children }) => { const updateUrlState = useCallback( (newState: PageQueryType) => { const path = typeof query.id === 'string' ? `/${query.id}` : pathname - const q = newState.q || query.q + const q = newState.q ?? query.q void push( { pathname: path, From a118c116d65d3eb19fc53b5cdc6ad0a06457b5cd Mon Sep 17 00:00:00 2001 From: Lucas Vogel Date: Thu, 10 Aug 2023 11:20:01 +0200 Subject: [PATCH 34/76] fix(UrlStateContext): Use window pushState instead of router push to avoid rerenders --- src/lib/UrlStateContext.tsx | 106 ++++++++++++++++++++++------ src/lib/facilityFilterUtil.ts | 6 ++ src/lib/mapRawQueryToState/index.ts | 13 ++-- 3 files changed, 95 insertions(+), 30 deletions(-) diff --git a/src/lib/UrlStateContext.tsx b/src/lib/UrlStateContext.tsx index 98c29769..ec1af8cf 100644 --- a/src/lib/UrlStateContext.tsx +++ b/src/lib/UrlStateContext.tsx @@ -1,8 +1,16 @@ import { useRouter } from 'next/router' -import { createContext, FC, useCallback, useContext, useEffect } from 'react' +import { + createContext, + FC, + useCallback, + useContext, + useEffect, + useMemo, + useState, +} from 'react' import { mapRawQueryToState, PageQueryType } from './mapRawQueryToState' - -export const MAX_TEXT_SEARCH_STRING_LENGTH = 100 +import { truncateSearchTerm } from './facilityFilterUtil' +import { removeNullAndUndefinedFromQuery } from './removeNullAndUndefinedFromQuery' type ParsedSearchTermCategoriesType = { categorySelfHelp: boolean @@ -25,41 +33,87 @@ export const useUrlState = (): [PageQueryType, SetUrlStateHandlerType] => useContext(UrlStateContext) as [PageQueryType, SetUrlStateHandlerType] export const UrlStateProvider: FC = ({ children }) => { - const { query, pathname, push } = useRouter() - const mappedQuery = mapRawQueryToState(query) + const { query, pathname } = useRouter() + const mappedQuery = useMemo(() => mapRawQueryToState(query), [query]) + const [latitude, setLatitude] = useState( + mappedQuery.latitude + ) + const [longitude, setLongitude] = useState( + mappedQuery.longitude + ) + const [zoom, setZoom] = useState(mappedQuery.zoom) + const [tags, setTags] = useState(mappedQuery.tags) + const [back, setBack] = useState(mappedQuery.back) + const [q, setQ] = useState(mappedQuery.q) + const [qCategories, setQCategories] = useState< + PageQueryType['qCategories'] | undefined + >(mappedQuery.qCategories) const updateUrlState = useCallback( (newState: PageQueryType) => { const path = typeof query.id === 'string' ? `/${query.id}` : pathname - const q = newState.q ?? query.q - void push( + const newQuery = { + ...newState, + ...(typeof newState.q !== 'undefined' + ? { q: truncateSearchTerm(newState.q) } + : {}), + } + const paramsString = new URLSearchParams({ + ...removeNullAndUndefinedFromQuery({ + latitude, + longitude, + zoom, + tags, + q, + qCategories, + back, + ...newState, + }), + } as Record).toString() + const as = `${path}?${paramsString}` + window.history.replaceState( { - pathname: path, - query: { - ...query, - ...newState, - q: q ? q.slice(0, MAX_TEXT_SEARCH_STRING_LENGTH) : undefined, - }, + ...window.history.state, + ...newQuery, + as, + url: pathname, }, - undefined, - { shallow: true } + '', + as ) + if (newState.latitude) setLatitude(newState.latitude) + if (newState.longitude) setLongitude(newState.longitude) + if (newState.zoom) setZoom(newState.zoom) + if (newState.tags) setTags(newState.tags) + if (newState.back) setBack(newState.back) + if (newState.q) setQ(newState.q) + if (newState.qCategories) setQCategories(newState.qCategories) }, - [query, pathname, push] + [query.id, pathname, latitude, longitude, zoom, tags, q, qCategories, back] ) + useEffect(() => { + setLatitude(mappedQuery.latitude) + setLongitude(mappedQuery.longitude) + setZoom(mappedQuery.zoom) + setTags(mappedQuery.tags) + setBack(mappedQuery.back) + setQ(mappedQuery.q) + setQCategories(mappedQuery.qCategories) + }, [mappedQuery]) + useEffect(() => { if (typeof window === 'undefined') return const urlParams = new URLSearchParams(window.location.search) if (urlParams.get('qCategories')) return const parsedQuery = mapRawQueryToState({ - q: urlParams.get('q') || undefined, - qCategories: urlParams.getAll('qCategories') || undefined, - tags: urlParams.getAll('tags') || undefined, - back: urlParams.get('back') || undefined, latitude: urlParams.get('latitude') || undefined, longitude: urlParams.get('longitude') || undefined, zoom: urlParams.get('zoom') || undefined, + tags: urlParams.getAll('tags') || undefined, + back: urlParams.get('back') || undefined, + q: urlParams.get('q') || undefined, + qCategories: urlParams.getAll('qCategories') || undefined, }) updateUrlState({ ...parsedQuery, @@ -71,7 +125,17 @@ export const UrlStateProvider: FC = ({ children }) => { // eslint-disable-next-line react-hooks/exhaustive-deps }, []) - return {children} + const state = { + latitude, + longitude, + zoom, + tags: tags || [], + back, + q: q || '', + qCategories: qCategories || [], + } + + return {children} } export function urlSearchCategoriesToStateSearchCategories( diff --git a/src/lib/facilityFilterUtil.ts b/src/lib/facilityFilterUtil.ts index f4c89896..58accbb7 100644 --- a/src/lib/facilityFilterUtil.ts +++ b/src/lib/facilityFilterUtil.ts @@ -43,6 +43,12 @@ export const getFilterStatus: GetFilterStatusType = ({ } } +const MAX_TEXT_SEARCH_STRING_LENGTH = 100 +export function truncateSearchTerm(searchTerm: unknown): string { + if (typeof searchTerm !== 'string') return '' + return encodeURIComponent(searchTerm.slice(0, MAX_TEXT_SEARCH_STRING_LENGTH)) +} + export const isFaclilityActive = ({ activeTargetLabels, activeTopcisLabels, diff --git a/src/lib/mapRawQueryToState/index.ts b/src/lib/mapRawQueryToState/index.ts index 1baef55e..118d6c57 100644 --- a/src/lib/mapRawQueryToState/index.ts +++ b/src/lib/mapRawQueryToState/index.ts @@ -1,4 +1,4 @@ -import { MAX_TEXT_SEARCH_STRING_LENGTH } from '@lib/UrlStateContext' +import { truncateSearchTerm } from '@lib/facilityFilterUtil' import { removeNullAndUndefinedFromQuery } from '@lib/removeNullAndUndefinedFromQuery' type qCategoryType = 1 | 2 | 3 | 4 | 5 @@ -9,6 +9,7 @@ export interface PageQueryType { tags?: number[] q?: string qCategories?: qCategoryType[] + back?: string } const isNumber = (val: unknown): boolean => @@ -23,12 +24,6 @@ const parseSingleNumber = ( return null } -const parseString = (val: string | string[] | undefined): string | null => { - if (typeof val === 'string') - return val.slice(0, MAX_TEXT_SEARCH_STRING_LENGTH) - return null -} - const parseNumbersArray = ( val: string | string[] | undefined ): number[] | null => { @@ -63,6 +58,6 @@ export const mapRawQueryToState = ( longitude: parseSingleNumber(rawQuery.longitude), zoom: parseSingleNumber(rawQuery.zoom), tags: parseNumbersArray(rawQuery.tags), - q: parseString(rawQuery.q), - qCategories: parseNumbersArray(rawQuery.qCategories), + q: truncateSearchTerm(rawQuery.q), + qCategories: parseNumbersArray(rawQuery.qCategories) as qCategoryType[], }) From 3fc919fccf896877c32da9dc82ca5db0c82344da Mon Sep 17 00:00:00 2001 From: Lucas Vogel Date: Thu, 10 Aug 2023 11:42:49 +0200 Subject: [PATCH 35/76] refactor(UrlStateContext): Simplify initial default function --- src/lib/UrlStateContext.tsx | 43 ++++++++++++------------------------- 1 file changed, 14 insertions(+), 29 deletions(-) diff --git a/src/lib/UrlStateContext.tsx b/src/lib/UrlStateContext.tsx index ec1af8cf..6d27f11b 100644 --- a/src/lib/UrlStateContext.tsx +++ b/src/lib/UrlStateContext.tsx @@ -52,29 +52,23 @@ export const UrlStateProvider: FC = ({ children }) => { const updateUrlState = useCallback( (newState: PageQueryType) => { const path = typeof query.id === 'string' ? `/${query.id}` : pathname - const newQuery = { + const state = removeNullAndUndefinedFromQuery({ + latitude, + longitude, + zoom, + tags, + qCategories, + back, ...newState, - ...(typeof newState.q !== 'undefined' - ? { q: truncateSearchTerm(newState.q) } - : {}), - } - const paramsString = new URLSearchParams({ - ...removeNullAndUndefinedFromQuery({ - latitude, - longitude, - zoom, - tags, - q, - qCategories, - back, - ...newState, - }), - } as Record).toString() + q: truncateSearchTerm(newState.q) || q, + }) + const paramsString = new URLSearchParams( + state as Record + ).toString() const as = `${path}?${paramsString}` window.history.replaceState( { ...window.history.state, - ...newQuery, as, url: pathname, }, @@ -100,23 +94,14 @@ export const UrlStateProvider: FC = ({ children }) => { setBack(mappedQuery.back) setQ(mappedQuery.q) setQCategories(mappedQuery.qCategories) - }, [mappedQuery]) + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [query]) useEffect(() => { if (typeof window === 'undefined') return const urlParams = new URLSearchParams(window.location.search) if (urlParams.get('qCategories')) return - const parsedQuery = mapRawQueryToState({ - latitude: urlParams.get('latitude') || undefined, - longitude: urlParams.get('longitude') || undefined, - zoom: urlParams.get('zoom') || undefined, - tags: urlParams.getAll('tags') || undefined, - back: urlParams.get('back') || undefined, - q: urlParams.get('q') || undefined, - qCategories: urlParams.getAll('qCategories') || undefined, - }) updateUrlState({ - ...parsedQuery, qCategories: stateSearchCategoriesToUrlSearchCategories({ categorySelfHelp: true, categoryAdvising: true, From 75e9cae1680d747d21f16162d8f74fe76fff3508 Mon Sep 17 00:00:00 2001 From: Lucas Vogel Date: Thu, 10 Aug 2023 12:09:02 +0200 Subject: [PATCH 36/76] fix(UrlStateContext): Ensure the query is sent with every link --- src/components/WelcomeScreen.tsx | 9 +++++++-- src/lib/UrlStateContext.tsx | 14 +++++++------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/components/WelcomeScreen.tsx b/src/components/WelcomeScreen.tsx index af361c28..c30da886 100644 --- a/src/components/WelcomeScreen.tsx +++ b/src/components/WelcomeScreen.tsx @@ -15,7 +15,7 @@ export const WelcomeScreen: FC<{ onShowOffers: () => void }> = ({ onShowOffers }) => { const texts = useTexts() - const { push } = useRouter() + const { push, query } = useRouter() const isMobile = useIsMobile() return (
} - onClick={() => void push(`/sofortige-hilfe`)} + onClick={() => + void push({ + pathname: '/sofortige-hilfe', + query, + }) + } > {texts.directHelpButtonText} diff --git a/src/lib/UrlStateContext.tsx b/src/lib/UrlStateContext.tsx index 8fd579e7..4395c36d 100644 --- a/src/lib/UrlStateContext.tsx +++ b/src/lib/UrlStateContext.tsx @@ -5,7 +5,6 @@ import { useCallback, useContext, useEffect, - useMemo, useState, } from 'react' import { mapRawQueryToState, PageQueryType } from './mapRawQueryToState' @@ -34,7 +33,7 @@ export const useUrlState = (): [PageQueryType, SetUrlStateHandlerType] => export const UrlStateProvider: FC = ({ children }) => { const { query, pathname } = useRouter() - const mappedQuery = useMemo(() => mapRawQueryToState(query), [query]) + const mappedQuery = mapRawQueryToState(query) const [latitude, setLatitude] = useState( mappedQuery.latitude ) @@ -60,20 +59,21 @@ export const UrlStateProvider: FC = ({ children }) => { qCategories, back, ...newState, - q: truncateSearchTerm(newState.q) || q, + q: newState.q ? truncateSearchTerm(newState.q) : q, }) const paramsString = new URLSearchParams( state as Record ).toString() const as = `${path}?${paramsString}` - void push( + window.history.replaceState( { ...window.history.state, + ...state, as, - url: pathname, + url: as, }, - as, - { shallow: true } + '', + as ) if (newState.latitude) setLatitude(newState.latitude) if (newState.longitude) setLongitude(newState.longitude) From e3bb85eb62d3d4ef80ad86ca07ec9dd9a53c1581 Mon Sep 17 00:00:00 2001 From: Lucas Vogel Date: Thu, 10 Aug 2023 14:36:52 +0200 Subject: [PATCH 37/76] fix(UrlStateContext): The text search is now clearable --- src/lib/UrlStateContext.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/UrlStateContext.tsx b/src/lib/UrlStateContext.tsx index 4395c36d..eedbb9b7 100644 --- a/src/lib/UrlStateContext.tsx +++ b/src/lib/UrlStateContext.tsx @@ -59,7 +59,7 @@ export const UrlStateProvider: FC = ({ children }) => { qCategories, back, ...newState, - q: newState.q ? truncateSearchTerm(newState.q) : q, + q: truncateSearchTerm(newState.q ?? q), }) const paramsString = new URLSearchParams( state as Record From 7ad2dbca1e523fa539407dec2be367db2501d8c5 Mon Sep 17 00:00:00 2001 From: Lucas Vogel Date: Thu, 10 Aug 2023 14:55:55 +0200 Subject: [PATCH 38/76] fix(UrlStateContext): always update state to avoid old values --- src/lib/UrlStateContext.tsx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/lib/UrlStateContext.tsx b/src/lib/UrlStateContext.tsx index eedbb9b7..547135dd 100644 --- a/src/lib/UrlStateContext.tsx +++ b/src/lib/UrlStateContext.tsx @@ -59,7 +59,7 @@ export const UrlStateProvider: FC = ({ children }) => { qCategories, back, ...newState, - q: truncateSearchTerm(newState.q ?? q), + q: truncateSearchTerm(newState.q), }) const paramsString = new URLSearchParams( state as Record @@ -75,15 +75,15 @@ export const UrlStateProvider: FC = ({ children }) => { '', as ) - if (newState.latitude) setLatitude(newState.latitude) - if (newState.longitude) setLongitude(newState.longitude) - if (newState.zoom) setZoom(newState.zoom) - if (newState.tags) setTags(newState.tags) - if (newState.back) setBack(newState.back) - if (newState.q) setQ(newState.q) - if (newState.qCategories) setQCategories(newState.qCategories) + setLatitude(state.latitude) + setLongitude(state.longitude) + setZoom(state.zoom) + setTags(state.tags) + setBack(state.back) + setQ(state.q) + setQCategories(state.qCategories) }, - [query.id, pathname, latitude, longitude, zoom, tags, q, qCategories, back] + [query.id, pathname, latitude, longitude, zoom, tags, qCategories, back] ) useEffect(() => { From c2392fa92cc8eed83f2a0780c41ecac8faf9beaf Mon Sep 17 00:00:00 2001 From: Lucas Vogel Date: Thu, 10 Aug 2023 14:57:18 +0200 Subject: [PATCH 39/76] refactor(sofortige-hilfe): Remove log statement f --- pages/sofortige-hilfe.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/pages/sofortige-hilfe.tsx b/pages/sofortige-hilfe.tsx index 42b5bf37..8aa613be 100644 --- a/pages/sofortige-hilfe.tsx +++ b/pages/sofortige-hilfe.tsx @@ -43,7 +43,6 @@ const Home: NextPage = () => { ) as keyof typeof texts ] - console.log(query) return ( <> From 254dbaf66db2516b2419671d79a6f4c08f109d8f Mon Sep 17 00:00:00 2001 From: Lucas Vogel Date: Thu, 10 Aug 2023 15:11:27 +0200 Subject: [PATCH 40/76] refactor(UrlStateContext): Cleanup the url when empty values --- src/lib/UrlStateContext.tsx | 6 +++--- src/lib/removeNullAndUndefinedFromQuery.ts | 11 +++++++++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/lib/UrlStateContext.tsx b/src/lib/UrlStateContext.tsx index 547135dd..c19edbbe 100644 --- a/src/lib/UrlStateContext.tsx +++ b/src/lib/UrlStateContext.tsx @@ -9,7 +9,7 @@ import { } from 'react' import { mapRawQueryToState, PageQueryType } from './mapRawQueryToState' import { truncateSearchTerm } from './facilityFilterUtil' -import { removeNullAndUndefinedFromQuery } from './removeNullAndUndefinedFromQuery' +import { removeFalsyFromQuery } from './removeNullAndUndefinedFromQuery' type ParsedSearchTermCategoriesType = { categorySelfHelp: boolean @@ -51,7 +51,7 @@ export const UrlStateProvider: FC = ({ children }) => { const updateUrlState = useCallback( (newState: PageQueryType) => { const path = typeof query.id === 'string' ? `/${query.id}` : pathname - const state = removeNullAndUndefinedFromQuery({ + const state = removeFalsyFromQuery({ latitude, longitude, zoom, @@ -64,7 +64,7 @@ export const UrlStateProvider: FC = ({ children }) => { const paramsString = new URLSearchParams( state as Record ).toString() - const as = `${path}?${paramsString}` + const as = [path, paramsString].filter(Boolean).join('?') window.history.replaceState( { ...window.history.state, diff --git a/src/lib/removeNullAndUndefinedFromQuery.ts b/src/lib/removeNullAndUndefinedFromQuery.ts index 7c33008f..d914ab4c 100644 --- a/src/lib/removeNullAndUndefinedFromQuery.ts +++ b/src/lib/removeNullAndUndefinedFromQuery.ts @@ -1,5 +1,16 @@ import { PageQueryType } from './mapRawQueryToState' +export const removeFalsyFromQuery = ( + obj: Record +): PageQueryType => { + Object.keys(obj).forEach((k) => { + const value = obj[k] + const isEmptyArray = Array.isArray(value) && value.length === 0 + if (!value || isEmptyArray) delete obj[k] + }) + return obj +} + export const removeNullAndUndefinedFromQuery = ( obj: Record ): PageQueryType => { From 4a9f6a68f0b49a930ab346463156f01116a0b969 Mon Sep 17 00:00:00 2001 From: Lucas Vogel Date: Thu, 10 Aug 2023 15:59:58 +0200 Subject: [PATCH 41/76] refactor(UrlStateContext): Enforce cleaning of falsy values from url --- src/lib/UrlStateContext.tsx | 22 +++++++++++-------- src/lib/mapRawQueryToState/index.ts | 4 ++-- ...edFromQuery.ts => removeFalsyFromQuery.ts} | 9 -------- 3 files changed, 15 insertions(+), 20 deletions(-) rename src/lib/{removeNullAndUndefinedFromQuery.ts => removeFalsyFromQuery.ts} (59%) diff --git a/src/lib/UrlStateContext.tsx b/src/lib/UrlStateContext.tsx index c19edbbe..f801d528 100644 --- a/src/lib/UrlStateContext.tsx +++ b/src/lib/UrlStateContext.tsx @@ -5,11 +5,12 @@ import { useCallback, useContext, useEffect, + useRef, useState, } from 'react' import { mapRawQueryToState, PageQueryType } from './mapRawQueryToState' import { truncateSearchTerm } from './facilityFilterUtil' -import { removeFalsyFromQuery } from './removeNullAndUndefinedFromQuery' +import { removeFalsyFromQuery } from './removeFalsyFromQuery' type ParsedSearchTermCategoriesType = { categorySelfHelp: boolean @@ -33,6 +34,7 @@ export const useUrlState = (): [PageQueryType, SetUrlStateHandlerType] => export const UrlStateProvider: FC = ({ children }) => { const { query, pathname } = useRouter() + const isInitalized = useRef(false) const mappedQuery = mapRawQueryToState(query) const [latitude, setLatitude] = useState( mappedQuery.latitude @@ -98,15 +100,17 @@ export const UrlStateProvider: FC = ({ children }) => { }, [query]) useEffect(() => { - if (typeof window === 'undefined') return + if (typeof window === 'undefined' || isInitalized.current) return const urlParams = new URLSearchParams(window.location.search) - if (urlParams.get('qCategories')) return - updateUrlState({ - qCategories: stateSearchCategoriesToUrlSearchCategories({ - categorySelfHelp: true, - categoryAdvising: true, - }), - }) + if (!urlParams.get('qCategories')) { + updateUrlState({ + qCategories: stateSearchCategoriesToUrlSearchCategories({ + categorySelfHelp: true, + categoryAdvising: true, + }), + }) + } + isInitalized.current = true // eslint-disable-next-line react-hooks/exhaustive-deps }, []) diff --git a/src/lib/mapRawQueryToState/index.ts b/src/lib/mapRawQueryToState/index.ts index 118d6c57..545fa1e9 100644 --- a/src/lib/mapRawQueryToState/index.ts +++ b/src/lib/mapRawQueryToState/index.ts @@ -1,5 +1,5 @@ import { truncateSearchTerm } from '@lib/facilityFilterUtil' -import { removeNullAndUndefinedFromQuery } from '@lib/removeNullAndUndefinedFromQuery' +import { removeFalsyFromQuery } from '@lib/removeFalsyFromQuery' type qCategoryType = 1 | 2 | 3 | 4 | 5 export interface PageQueryType { @@ -53,7 +53,7 @@ const parseNumbersArray = ( export const mapRawQueryToState = ( rawQuery: Record ): PageQueryType => - removeNullAndUndefinedFromQuery({ + removeFalsyFromQuery({ latitude: parseSingleNumber(rawQuery.latitude), longitude: parseSingleNumber(rawQuery.longitude), zoom: parseSingleNumber(rawQuery.zoom), diff --git a/src/lib/removeNullAndUndefinedFromQuery.ts b/src/lib/removeFalsyFromQuery.ts similarity index 59% rename from src/lib/removeNullAndUndefinedFromQuery.ts rename to src/lib/removeFalsyFromQuery.ts index d914ab4c..e69e1274 100644 --- a/src/lib/removeNullAndUndefinedFromQuery.ts +++ b/src/lib/removeFalsyFromQuery.ts @@ -10,12 +10,3 @@ export const removeFalsyFromQuery = ( }) return obj } - -export const removeNullAndUndefinedFromQuery = ( - obj: Record -): PageQueryType => { - Object.keys(obj).forEach( - (k) => (obj[k] === null || typeof obj[k] === 'undefined') && delete obj[k] - ) - return obj -} From f1d03098060756ad492cadb2aa42824d0d6e83ed Mon Sep 17 00:00:00 2001 From: Lucas Vogel Date: Thu, 10 Aug 2023 16:20:24 +0200 Subject: [PATCH 42/76] refactor(github-actions): Add warnForPRIntoMain action to prevent merge in main directly --- .github/workflows/warnForPRIntoMain.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 .github/workflows/warnForPRIntoMain.yml diff --git a/.github/workflows/warnForPRIntoMain.yml b/.github/workflows/warnForPRIntoMain.yml new file mode 100644 index 00000000..d84e4c2d --- /dev/null +++ b/.github/workflows/warnForPRIntoMain.yml @@ -0,0 +1,15 @@ +name: 'Prevent merge from non-staging to master' +on: + pull_request: + types: [opened, synchronize, reopened] + +jobs: + warn_main_merge: + runs-on: 'ubuntu-latest' + name: 'Validate PR Source and Target Branches' + steps: + - name: 'Checking source and target branch in PR' + uses: 'technologiestiftung/warn-for-main-merge-action@v1.13' + with: + stagingName: 'staging' + mainName: 'master' \ No newline at end of file From e461666c52c56700ce4286d8e9906dbd702efd82 Mon Sep 17 00:00:00 2001 From: Lucas Vogel Date: Thu, 10 Aug 2023 16:43:13 +0200 Subject: [PATCH 43/76] fix(UrlStateContext): Avoid resetting everything when no categories selected --- src/lib/UrlStateContext.tsx | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/lib/UrlStateContext.tsx b/src/lib/UrlStateContext.tsx index f801d528..2c7bf3de 100644 --- a/src/lib/UrlStateContext.tsx +++ b/src/lib/UrlStateContext.tsx @@ -60,9 +60,10 @@ export const UrlStateProvider: FC = ({ children }) => { tags, qCategories, back, + q, ...newState, - q: truncateSearchTerm(newState.q), }) + state.q = truncateSearchTerm(state.q) const paramsString = new URLSearchParams( state as Record ).toString() @@ -85,7 +86,7 @@ export const UrlStateProvider: FC = ({ children }) => { setQ(state.q) setQCategories(state.qCategories) }, - [query.id, pathname, latitude, longitude, zoom, tags, qCategories, back] + [query.id, pathname, latitude, longitude, zoom, tags, qCategories, back, q] ) useEffect(() => { @@ -103,12 +104,19 @@ export const UrlStateProvider: FC = ({ children }) => { if (typeof window === 'undefined' || isInitalized.current) return const urlParams = new URLSearchParams(window.location.search) if (!urlParams.get('qCategories')) { - updateUrlState({ + const query = mapRawQueryToState({ + latitude: urlParams.get('latitude') || undefined, + longitude: urlParams.get('longitude') || undefined, + zoom: urlParams.get('zoom') || undefined, + tags: urlParams.getAll('tags')?.join(',') || undefined, + back: urlParams.get('back') || undefined, + q: urlParams.get('q') || undefined, qCategories: stateSearchCategoriesToUrlSearchCategories({ categorySelfHelp: true, categoryAdvising: true, - }), + })?.join(','), }) + updateUrlState(query) } isInitalized.current = true // eslint-disable-next-line react-hooks/exhaustive-deps From 7d1008c3719fa2a0a557faf6c95301fba732a297 Mon Sep 17 00:00:00 2001 From: Lucas Vogel Date: Thu, 10 Aug 2023 18:08:09 +0200 Subject: [PATCH 44/76] fix(UrlStateContext): Fix missing filters on page change when no categories are selected --- src/lib/UrlStateContext.tsx | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/lib/UrlStateContext.tsx b/src/lib/UrlStateContext.tsx index 2c7bf3de..b19ce854 100644 --- a/src/lib/UrlStateContext.tsx +++ b/src/lib/UrlStateContext.tsx @@ -5,7 +5,6 @@ import { useCallback, useContext, useEffect, - useRef, useState, } from 'react' import { mapRawQueryToState, PageQueryType } from './mapRawQueryToState' @@ -34,7 +33,6 @@ export const useUrlState = (): [PageQueryType, SetUrlStateHandlerType] => export const UrlStateProvider: FC = ({ children }) => { const { query, pathname } = useRouter() - const isInitalized = useRef(false) const mappedQuery = mapRawQueryToState(query) const [latitude, setLatitude] = useState( mappedQuery.latitude @@ -101,7 +99,7 @@ export const UrlStateProvider: FC = ({ children }) => { }, [query]) useEffect(() => { - if (typeof window === 'undefined' || isInitalized.current) return + if (typeof window === 'undefined') return const urlParams = new URLSearchParams(window.location.search) if (!urlParams.get('qCategories')) { const query = mapRawQueryToState({ @@ -118,9 +116,8 @@ export const UrlStateProvider: FC = ({ children }) => { }) updateUrlState(query) } - isInitalized.current = true // eslint-disable-next-line react-hooks/exhaustive-deps - }, []) + }, [query.id, pathname]) const state = { latitude, From e14a4fd8c7892e1393e9581e21db9a07fca5edf4 Mon Sep 17 00:00:00 2001 From: Lucas Vogel Date: Thu, 10 Aug 2023 18:18:38 +0200 Subject: [PATCH 45/76] fix(facilityFilterUtil): Remove encodeURIComponent as it leads to formatting problems and is already handled by next --- src/lib/facilityFilterUtil.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/facilityFilterUtil.ts b/src/lib/facilityFilterUtil.ts index 58accbb7..c7e3708f 100644 --- a/src/lib/facilityFilterUtil.ts +++ b/src/lib/facilityFilterUtil.ts @@ -46,7 +46,7 @@ export const getFilterStatus: GetFilterStatusType = ({ const MAX_TEXT_SEARCH_STRING_LENGTH = 100 export function truncateSearchTerm(searchTerm: unknown): string { if (typeof searchTerm !== 'string') return '' - return encodeURIComponent(searchTerm.slice(0, MAX_TEXT_SEARCH_STRING_LENGTH)) + return searchTerm.slice(0, MAX_TEXT_SEARCH_STRING_LENGTH) } export const isFaclilityActive = ({ From 60f9c094411cd4d3024d2e48f911cfcda553499e Mon Sep 17 00:00:00 2001 From: Lucas Vogel Date: Mon, 14 Aug 2023 10:28:55 +0200 Subject: [PATCH 46/76] refactor(revalidation): Remove nextjs revalidation --- pages/[id].tsx | 1 - pages/index.tsx | 1 - pages/map.tsx | 1 - pages/sofortige-hilfe.tsx | 1 - 4 files changed, 4 deletions(-) diff --git a/pages/[id].tsx b/pages/[id].tsx index f3a2a8f7..5e326981 100644 --- a/pages/[id].tsx +++ b/pages/[id].tsx @@ -40,7 +40,6 @@ export const getStaticProps: GetStaticProps = async ({ params }) => { labels, center: [record.fields.long, record.fields.lat], }, - revalidate: 120, } } diff --git a/pages/index.tsx b/pages/index.tsx index 65b20dfe..2eebe6cf 100644 --- a/pages/index.tsx +++ b/pages/index.tsx @@ -19,7 +19,6 @@ export const getStaticProps: GetStaticProps = async () => { ) return { props: { texts, recordsWithOnlyLabels, labels }, - revalidate: 120, } } diff --git a/pages/map.tsx b/pages/map.tsx index 1c5933b6..ca3c6ace 100644 --- a/pages/map.tsx +++ b/pages/map.tsx @@ -29,7 +29,6 @@ export const getStaticProps: GetStaticProps = async () => { records: recordsWithOnlyMinimum, labels, }, - revalidate: 120, } } diff --git a/pages/sofortige-hilfe.tsx b/pages/sofortige-hilfe.tsx index d08b2df7..87637b01 100644 --- a/pages/sofortige-hilfe.tsx +++ b/pages/sofortige-hilfe.tsx @@ -14,7 +14,6 @@ export const getStaticProps: GetStaticProps = async () => { const texts = await getGristTexts() return { props: { texts }, - revalidate: 120, } } From 999e4b0bd7077e1a89053a6273697d0b4e91c424 Mon Sep 17 00:00:00 2001 From: Lucas Vogel Date: Mon, 14 Aug 2023 10:59:27 +0200 Subject: [PATCH 47/76] feat(MapLayout): Toggle display of filter sidebar on large/small displays --- src/components/MapLayout.tsx | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/components/MapLayout.tsx b/src/components/MapLayout.tsx index 45250c5d..9ef090b5 100644 --- a/src/components/MapLayout.tsx +++ b/src/components/MapLayout.tsx @@ -1,4 +1,4 @@ -import { FC, useEffect, useState } from 'react' +import { FC, useCallback, useEffect, useState } from 'react' import { FacilitiesMap } from './Map' import classNames from '@lib/classNames' import { useRouter } from 'next/router' @@ -18,6 +18,7 @@ import { Arrow } from './icons/Arrow' import { useIsMobile } from '@lib/hooks/useIsMobile' const SCROLL_THRESHOLD = 300 +const LARGE_SCREEN_BREAKPOINT_MIN_WIDTH = 1920 export const MapLayout: FC<{ records: MinimalRecordType[] @@ -72,6 +73,30 @@ export const MapLayout: FC<{ setMapCenter([currentRecord.longitude, currentRecord.latitude]) }, [query.id, records]) + const updateSidebarVisibility = useCallback( + (evt: MediaQueryListEvent | boolean) => { + const isMatch = typeof evt === 'boolean' ? evt : evt?.matches || false + setFilterSidebarIsOpened(isMatch) + }, + [setFilterSidebarIsOpened] + ) + + useEffect(() => { + if (typeof window === 'undefined') return + const minWidth = LARGE_SCREEN_BREAKPOINT_MIN_WIDTH + updateSidebarVisibility(window.innerWidth > minWidth) + const windowWidthMediaQuery = window.matchMedia( + `(min-width: ${minWidth}px)` + ) + + windowWidthMediaQuery.addEventListener('change', updateSidebarVisibility) + return () => + windowWidthMediaQuery.removeEventListener( + 'change', + updateSidebarVisibility + ) + }, [setFilterSidebarIsOpened, updateSidebarVisibility]) + return (
Date: Mon, 14 Aug 2023 15:52:27 +0200 Subject: [PATCH 48/76] feat(typos): Fix typos in function names --- src/components/Map/index.tsx | 11 +++---- src/components/TextSearch.tsx | 4 +-- src/lib/TextsContext.tsx | 2 +- src/lib/UrlStateContext.tsx | 6 ++-- src/lib/facilityFilterUtil.ts | 32 ++++++++++----------- src/lib/hooks/useActiveIdsBySearchTerm.ts | 2 +- src/lib/hooks/useFilteredFacilitiesCount.ts | 10 +++---- 7 files changed, 32 insertions(+), 35 deletions(-) diff --git a/src/components/Map/index.tsx b/src/components/Map/index.tsx index 2f42bab7..b828706d 100644 --- a/src/components/Map/index.tsx +++ b/src/components/Map/index.tsx @@ -30,10 +30,7 @@ import { useInitialViewport } from '@lib/hooks/useInitialViewport' import { useMapHighlightMarker } from '@lib/hooks/useMapHighlightMarker' import { useMaplibreMap } from '@lib/hooks/useMaplibreMap' import { useFiltersWithActiveProp } from '@lib/hooks/useFiltersWithActiveProp' -import { - getActiveLabelGroups, - isFaclilityActive, -} from '@lib/facilityFilterUtil' +import { getActiveLabelGroups, isFacilityActive } from '@lib/facilityFilterUtil' import { useActiveIdsBySearchTerm } from '@lib/hooks/useActiveIdsBySearchTerm' interface MapType { @@ -184,13 +181,13 @@ export const FacilitiesMap: FC = ({ const updateFilteredFacilities = useCallback(() => { if (!map || !markers || !mapLayersLoaded) return - const { activeTopcisLabels, activeTargetLabels } = + const { activeTopicsLabels, activeTargetLabels } = getActiveLabelGroups(labels) markers.forEach((marker) => { - const active = isFaclilityActive({ + const active = isFacilityActive({ facilityId: marker.id, facilityLabels: marker.labels, - activeTopcisLabels, + activeTopicsLabels, activeTargetLabels, activeIdsBySearchTerm: activeIdsBySearchTerm.ids, }) diff --git a/src/components/TextSearch.tsx b/src/components/TextSearch.tsx index 9cf080c4..f7dc0002 100644 --- a/src/components/TextSearch.tsx +++ b/src/components/TextSearch.tsx @@ -11,7 +11,7 @@ type CategoriesType = Partial<{ categoryAdvising: boolean categoryClinics: boolean categoryOnlineOffers: boolean - categoryDisctrictOfficeHelp: boolean + categoryDistrictOfficeHelp: boolean }> interface StateType { text: string @@ -152,7 +152,7 @@ export const getCategoriesTexts = ( categoryAdvising: texts.textSearchCategoryAdvising, categoryClinics: texts.textSearchCategoryClinics, categoryOnlineOffers: texts.textSearchCategoryOnlineOffers, - categoryDisctrictOfficeHelp: texts.textSearchCategoryDisctrictOfficeHelp, + categoryDistrictOfficeHelp: texts.textSearchcategoryDistrictOfficeHelp, } } diff --git a/src/lib/TextsContext.tsx b/src/lib/TextsContext.tsx index deea9d52..c79a74ba 100644 --- a/src/lib/TextsContext.tsx +++ b/src/lib/TextsContext.tsx @@ -124,7 +124,7 @@ const defaultValue = { textSearchCategoryAdvising: '', textSearchCategoryClinics: '', textSearchCategoryOnlineOffers: '', - textSearchCategoryDisctrictOfficeHelp: '', + textSearchcategoryDistrictOfficeHelp: '', optionalFurtherSearchIntroText: '', filtersButtonLoading: '', } diff --git a/src/lib/UrlStateContext.tsx b/src/lib/UrlStateContext.tsx index b19ce854..5775bc02 100644 --- a/src/lib/UrlStateContext.tsx +++ b/src/lib/UrlStateContext.tsx @@ -15,7 +15,7 @@ type ParsedSearchTermCategoriesType = { categorySelfHelp: boolean categoryAdvising: boolean categoryClinics: boolean - categoryDisctrictOfficeHelp: boolean + categoryDistrictOfficeHelp: boolean categoryOnlineOffers: boolean } @@ -139,7 +139,7 @@ export function urlSearchCategoriesToStateSearchCategories( categorySelfHelp: !!qCategories?.includes(1), categoryAdvising: !!qCategories?.includes(2), categoryClinics: !!qCategories?.includes(3), - categoryDisctrictOfficeHelp: !!qCategories?.includes(4), + categoryDistrictOfficeHelp: !!qCategories?.includes(4), categoryOnlineOffers: !!qCategories?.includes(5), } } @@ -153,7 +153,7 @@ export function stateSearchCategoriesToUrlSearchCategories( searchTermCategories.categorySelfHelp && 1, searchTermCategories.categoryAdvising && 2, searchTermCategories.categoryClinics && 3, - searchTermCategories.categoryDisctrictOfficeHelp && 4, + searchTermCategories.categoryDistrictOfficeHelp && 4, searchTermCategories.categoryOnlineOffers && 5, ].filter(Boolean) as PageQueryType['qCategories'] } diff --git a/src/lib/facilityFilterUtil.ts b/src/lib/facilityFilterUtil.ts index c7e3708f..49013e9f 100644 --- a/src/lib/facilityFilterUtil.ts +++ b/src/lib/facilityFilterUtil.ts @@ -7,9 +7,9 @@ interface GetFilteredFacilitiesPropType { activeIdsBySearchTerm: MinimalRecordType['id'][] | null } -interface IsFaclilityActivePropType { +interface isFacilityActivePropType { activeTargetLabels: GristLabelType[] - activeTopcisLabels: GristLabelType[] + activeTopicsLabels: GristLabelType[] facilityLabels: GristLabelType['id'][] facilityId: MinimalRecordType['id'] activeIdsBySearchTerm: MinimalRecordType['id'][] | null @@ -18,7 +18,7 @@ interface IsFaclilityActivePropType { type GetFilterStatusType = (props: { activeIdsBySearchTerm: MinimalRecordType['id'][] | null activeTargetLabels: GristLabelType[] - activeTopcisLabels: GristLabelType[] + activeTopicsLabels: GristLabelType[] }) => { isFilteredByTopic: boolean isFilteredByTarget: boolean @@ -29,10 +29,10 @@ type GetFilterStatusType = (props: { export const getFilterStatus: GetFilterStatusType = ({ activeIdsBySearchTerm, activeTargetLabels, - activeTopcisLabels, + activeTopicsLabels, }) => { const isFilteredBySearchTerm = activeIdsBySearchTerm !== null - const isFilteredByTopic = activeTopcisLabels.length > 0 + const isFilteredByTopic = activeTopicsLabels.length > 0 const isFilteredByTarget = activeTargetLabels.length > 0 return { isFilteredByTopic, @@ -49,13 +49,13 @@ export function truncateSearchTerm(searchTerm: unknown): string { return searchTerm.slice(0, MAX_TEXT_SEARCH_STRING_LENGTH) } -export const isFaclilityActive = ({ +export const isFacilityActive = ({ activeTargetLabels, - activeTopcisLabels, + activeTopicsLabels, facilityLabels, facilityId, activeIdsBySearchTerm, -}: IsFaclilityActivePropType): boolean => { +}: isFacilityActivePropType): boolean => { const { isNotFilteredAtAll, isFilteredByTopic, @@ -64,11 +64,11 @@ export const isFaclilityActive = ({ } = getFilterStatus({ activeIdsBySearchTerm, activeTargetLabels, - activeTopcisLabels, + activeTopicsLabels, }) if (isNotFilteredAtAll) return true const hasAllOfTheActiveTopics = - activeTopcisLabels?.every((tag) => facilityLabels.includes(tag.id)) || false + activeTopicsLabels?.every((tag) => facilityLabels.includes(tag.id)) || false const hasAnActiveTarget = (activeTargetLabels[0] && facilityLabels.includes(activeTargetLabels[0].id)) || @@ -94,10 +94,10 @@ export const isFaclilityActive = ({ export const getActiveLabelGroups = ( labels: GristLabelType[] ): { - activeTopcisLabels: GristLabelType[] + activeTopicsLabels: GristLabelType[] activeTargetLabels: GristLabelType[] } => ({ - activeTopcisLabels: labels.filter( + activeTopicsLabels: labels.filter( (f) => f.isActive && f.fields.group2 !== 'zielpublikum' ), activeTargetLabels: labels.filter( @@ -110,19 +110,19 @@ export const getFilteredFacilities = ({ labels, activeIdsBySearchTerm, }: GetFilteredFacilitiesPropType): MinimalRecordType[] => { - const { activeTopcisLabels, activeTargetLabels } = + const { activeTopicsLabels, activeTargetLabels } = getActiveLabelGroups(labels) const { isNotFilteredAtAll } = getFilterStatus({ activeIdsBySearchTerm, activeTargetLabels, - activeTopcisLabels, + activeTopicsLabels, }) if (isNotFilteredAtAll) return facilities return facilities.filter((facility) => { - return isFaclilityActive({ + return isFacilityActive({ facilityLabels: facility.labels, facilityId: facility.id, - activeTopcisLabels, + activeTopicsLabels, activeTargetLabels, activeIdsBySearchTerm, }) diff --git a/src/lib/hooks/useActiveIdsBySearchTerm.ts b/src/lib/hooks/useActiveIdsBySearchTerm.ts index b39d47f8..79c3845e 100644 --- a/src/lib/hooks/useActiveIdsBySearchTerm.ts +++ b/src/lib/hooks/useActiveIdsBySearchTerm.ts @@ -79,7 +79,7 @@ function categoriesToFilterString( return [ categoriesState.categoryAdvising && 'Beratung', categoriesState.categoryClinics && 'Klinik', - categoriesState.categoryDisctrictOfficeHelp && 'Amt', + categoriesState.categoryDistrictOfficeHelp && 'Amt', categoriesState.categoryOnlineOffers && 'Online', categoriesState.categorySelfHelp && 'Selbsthilfe', ] diff --git a/src/lib/hooks/useFilteredFacilitiesCount.ts b/src/lib/hooks/useFilteredFacilitiesCount.ts index 5d975fe9..69529cc8 100644 --- a/src/lib/hooks/useFilteredFacilitiesCount.ts +++ b/src/lib/hooks/useFilteredFacilitiesCount.ts @@ -2,7 +2,7 @@ import { TableRowType } from '@common/types/gristData' import { getActiveLabelGroups, getFilterStatus, - isFaclilityActive, + isFacilityActive, } from '@lib/facilityFilterUtil' import { useEffect, useState } from 'react' import { useFiltersWithActiveProp } from './useFiltersWithActiveProp' @@ -28,13 +28,13 @@ export const useFilteredFacilitiesCount = ( ) useEffect(() => { - const { activeTopcisLabels, activeTargetLabels } = + const { activeTopicsLabels, activeTargetLabels } = getActiveLabelGroups(labels) const { isNotFilteredAtAll } = getFilterStatus({ activeIdsBySearchTerm: activeIdsBySearchTerm.ids, activeTargetLabels, - activeTopcisLabels, + activeTopicsLabels, }) if (isNotFilteredAtAll) { @@ -44,11 +44,11 @@ export const useFilteredFacilitiesCount = ( const filteredFacilities = facilitiesWithOnlyLabels.filter( ([id, recordLabels]) => - isFaclilityActive({ + isFacilityActive({ facilityLabels: recordLabels, facilityId: id, activeTargetLabels: activeTargetLabels, - activeTopcisLabels: activeTopcisLabels, + activeTopicsLabels: activeTopicsLabels, activeIdsBySearchTerm: activeIdsBySearchTerm.ids, }) ) From 162d55546cb925745dca84411d5653847961dcef Mon Sep 17 00:00:00 2001 From: Lucas Vogel Date: Mon, 14 Aug 2023 16:28:56 +0200 Subject: [PATCH 49/76] refactor(UrlStateContext): Attempt to simplify the UrlStateContext --- src/lib/UrlStateContext.tsx | 178 +++++++++++++++++++++--------------- 1 file changed, 106 insertions(+), 72 deletions(-) diff --git a/src/lib/UrlStateContext.tsx b/src/lib/UrlStateContext.tsx index 5775bc02..9df1a3a2 100644 --- a/src/lib/UrlStateContext.tsx +++ b/src/lib/UrlStateContext.tsx @@ -34,48 +34,28 @@ export const useUrlState = (): [PageQueryType, SetUrlStateHandlerType] => export const UrlStateProvider: FC = ({ children }) => { const { query, pathname } = useRouter() const mappedQuery = mapRawQueryToState(query) - const [latitude, setLatitude] = useState( - mappedQuery.latitude - ) - const [longitude, setLongitude] = useState( - mappedQuery.longitude - ) - const [zoom, setZoom] = useState(mappedQuery.zoom) - const [tags, setTags] = useState(mappedQuery.tags) - const [back, setBack] = useState(mappedQuery.back) - const [q, setQ] = useState(mappedQuery.q) - const [qCategories, setQCategories] = useState< - PageQueryType['qCategories'] | undefined - >(mappedQuery.qCategories) + const [latitude, setLatitude] = useState(mappedQuery.latitude) + const [longitude, setLongitude] = useState(mappedQuery.longitude) + const [zoom, setZoom] = useState(mappedQuery.zoom) + const [tags, setTags] = useState(mappedQuery.tags) + const [back, setBack] = useState(mappedQuery.back) + const [q, setQ] = useState(mappedQuery.q) + const [qCategories, setQCategories] = useState(mappedQuery.qCategories) - const updateUrlState = useCallback( - (newState: PageQueryType) => { - const path = typeof query.id === 'string' ? `/${query.id}` : pathname - const state = removeFalsyFromQuery({ - latitude, - longitude, - zoom, - tags, - qCategories, - back, - q, - ...newState, - }) - state.q = truncateSearchTerm(state.q) - const paramsString = new URLSearchParams( - state as Record - ).toString() - const as = [path, paramsString].filter(Boolean).join('?') - window.history.replaceState( - { - ...window.history.state, - ...state, - as, - url: as, - }, - '', - as - ) + // GET A COMBINED STATE OBJECT WITH APPLIED DEFAULTS + const state = getFormattedUrlStateWithDefaults({ + latitude, + longitude, + zoom, + tags, + back, + q, + qCategories, + }) + + // UTILITY FUNCTION TO UPDATE ALL REACT STATES + const updateReactUrlState = useCallback( + (state: PageQueryType) => { setLatitude(state.latitude) setLongitude(state.longitude) setZoom(state.zoom) @@ -84,51 +64,53 @@ export const UrlStateProvider: FC = ({ children }) => { setQ(state.q) setQCategories(state.qCategories) }, - [query.id, pathname, latitude, longitude, zoom, tags, qCategories, back, q] + [setLatitude, setLongitude, setZoom, setTags, setBack, setQ, setQCategories] ) - useEffect(() => { - setLatitude(mappedQuery.latitude) - setLongitude(mappedQuery.longitude) - setZoom(mappedQuery.zoom) - setTags(mappedQuery.tags) - setBack(mappedQuery.back) - setQ(mappedQuery.q) - setQCategories(mappedQuery.qCategories) + // UTILITY FUNCTION TO UPDATE URL STATE (Passed down the context as a setter) + const updateUrlState = useCallback( + (newState: PageQueryType) => { + const path = typeof query.id === 'string' ? `/${query.id}` : pathname + + const fullNewState = removeFalsyFromQuery({ + ...state, + ...newState, + }) + fullNewState.q = truncateSearchTerm(fullNewState.q) + + updateStateWindowLocation(path, fullNewState) + updateReactUrlState(fullNewState) + }, + [query.id, pathname, state, updateReactUrlState] + ) + + // UPDATE REACT STATE ON NEXTJS ROUTER QUERY CHANGE + useEffect( + () => updateReactUrlState(mappedQuery), // eslint-disable-next-line react-hooks/exhaustive-deps - }, [query]) + [query] + ) + // UPADTE URL WITH DEFAULTS ON INITIAL LOAD AND PAGE CHANGE useEffect(() => { if (typeof window === 'undefined') return - const urlParams = new URLSearchParams(window.location.search) - if (!urlParams.get('qCategories')) { - const query = mapRawQueryToState({ - latitude: urlParams.get('latitude') || undefined, - longitude: urlParams.get('longitude') || undefined, - zoom: urlParams.get('zoom') || undefined, - tags: urlParams.getAll('tags')?.join(',') || undefined, - back: urlParams.get('back') || undefined, - q: urlParams.get('q') || undefined, + + const urlStateFromWindowLocation = getUrlStateFromWindowLocation() + const allCatergoriesAreUnselected = + !urlStateFromWindowLocation.qCategories?.length + + if (allCatergoriesAreUnselected) { + updateUrlState({ + ...urlStateFromWindowLocation, qCategories: stateSearchCategoriesToUrlSearchCategories({ categorySelfHelp: true, categoryAdvising: true, - })?.join(','), + }), }) - updateUrlState(query) } // eslint-disable-next-line react-hooks/exhaustive-deps }, [query.id, pathname]) - const state = { - latitude, - longitude, - zoom, - tags: tags || [], - back, - q: q || '', - qCategories: qCategories || [], - } - return {children} } @@ -157,3 +139,55 @@ export function stateSearchCategoriesToUrlSearchCategories( searchTermCategories.categoryOnlineOffers && 5, ].filter(Boolean) as PageQueryType['qCategories'] } + +function getUrlStateFromWindowLocation(): PageQueryType { + const urlParams = new URLSearchParams(window.location.search) + return mapRawQueryToState({ + latitude: urlParams.get('latitude') || undefined, + longitude: urlParams.get('longitude') || undefined, + zoom: urlParams.get('zoom') || undefined, + tags: urlParams.getAll('tags')?.join(',') || undefined, + back: urlParams.get('back') || undefined, + q: urlParams.get('q') || undefined, + qCategories: urlParams.getAll('qCategories')?.join(',') || undefined, + }) +} + +function getFormattedUrlStateWithDefaults({ + latitude, + longitude, + zoom, + tags, + back, + q, + qCategories, +}: PageQueryType): PageQueryType { + return { + latitude, + longitude, + zoom, + tags: tags || [], + back, + q: q || '', + qCategories: qCategories || [], + } +} + +function updateStateWindowLocation(path: string, state: PageQueryType): void { + const paramsString = new URLSearchParams( + state as Record + ).toString() + + const as = [path, paramsString].filter(Boolean).join('?') + + window.history.replaceState( + { + ...window.history.state, + ...state, + as, + url: as, + }, + '', + as + ) +} From 115fbd7a38a8377fd754d22f3f30632f9793cb51 Mon Sep 17 00:00:00 2001 From: Lucas Vogel Date: Mon, 14 Aug 2023 16:35:28 +0200 Subject: [PATCH 50/76] fix(TextsContext): Fix text key name case change --- src/lib/TextsContext.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/TextsContext.tsx b/src/lib/TextsContext.tsx index c79a74ba..3b01f905 100644 --- a/src/lib/TextsContext.tsx +++ b/src/lib/TextsContext.tsx @@ -124,7 +124,7 @@ const defaultValue = { textSearchCategoryAdvising: '', textSearchCategoryClinics: '', textSearchCategoryOnlineOffers: '', - textSearchcategoryDistrictOfficeHelp: '', + textSearchCategoryDistrictOfficeHelp: '', optionalFurtherSearchIntroText: '', filtersButtonLoading: '', } From 97108452f3946ac0d13bb46faf4e22f42668224b Mon Sep 17 00:00:00 2001 From: Lucas Vogel Date: Mon, 14 Aug 2023 16:37:57 +0200 Subject: [PATCH 51/76] fix(TextSearch): Use changed key Text in TextSearch --- src/components/TextSearch.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/TextSearch.tsx b/src/components/TextSearch.tsx index f7dc0002..263cc88e 100644 --- a/src/components/TextSearch.tsx +++ b/src/components/TextSearch.tsx @@ -152,7 +152,7 @@ export const getCategoriesTexts = ( categoryAdvising: texts.textSearchCategoryAdvising, categoryClinics: texts.textSearchCategoryClinics, categoryOnlineOffers: texts.textSearchCategoryOnlineOffers, - categoryDistrictOfficeHelp: texts.textSearchcategoryDistrictOfficeHelp, + categoryDistrictOfficeHelp: texts.textSearchCategoryDistrictOfficeHelp, } } From 92ecbdb74c1ac99fc7cfc23693a87bf046372b85 Mon Sep 17 00:00:00 2001 From: Lucas Vogel Date: Tue, 15 Aug 2023 09:34:32 +0200 Subject: [PATCH 52/76] fix(UrlStateContext): Fix typo in comment --- src/lib/UrlStateContext.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/UrlStateContext.tsx b/src/lib/UrlStateContext.tsx index 9df1a3a2..e1b04829 100644 --- a/src/lib/UrlStateContext.tsx +++ b/src/lib/UrlStateContext.tsx @@ -91,7 +91,7 @@ export const UrlStateProvider: FC = ({ children }) => { [query] ) - // UPADTE URL WITH DEFAULTS ON INITIAL LOAD AND PAGE CHANGE + // UPDATE URL WITH DEFAULTS ON INITIAL LOAD AND PAGE CHANGE useEffect(() => { if (typeof window === 'undefined') return From 8075b3a50494ea401d1919653cb79880b88218a5 Mon Sep 17 00:00:00 2001 From: Lucas Vogel Date: Tue, 15 Aug 2023 16:26:38 +0200 Subject: [PATCH 53/76] feat(FacilitiesMap): Color geopins based on type --- src/colors.js | 32 +++++++++++++++++++++++++ src/components/Map/index.tsx | 11 ++++----- src/lib/facilityColorUtil.ts | 45 +++++++++++++++++++++++++++++++++++ src/lib/mapRecordToMinimum.ts | 2 ++ tailwind.config.js | 27 ++------------------- 5 files changed, 85 insertions(+), 32 deletions(-) create mode 100644 src/colors.js create mode 100644 src/lib/facilityColorUtil.ts diff --git a/src/colors.js b/src/colors.js new file mode 100644 index 00000000..fdbad895 --- /dev/null +++ b/src/colors.js @@ -0,0 +1,32 @@ +module.exports = { + purple: { + 50: '#F9F1F7', + 200: '#ECD5E6', + 400: '#8D3F78', + 500: '#773666', + 700: '#4A1A3E', + }, + // TODO: Note that currently primary and purple-500 are the same. + // When there is time for refactoring, we should use the purple scale everywhere. + primary: '#773666', + black: '#0A1045', + success: '#4f9033', + info: '#5891C3', + gray: { + '10': '#EFEFEF', + '20': '#CCCCCC', + '40': '#999999', + '60': '#666666', + '80': '#333333', + }, + type: { + categorySelfHelp: '#834375', + categoryAdvising: '#91CE41', + categoryClinics: '#BC748B', + categoryDistrictOfficeHelp: '#BC8746', + categoryOnlineOffers: '#6969F3', + }, + white: '#FFF', + trasparent: 'transparent', + currentColor: 'currentColor', +} diff --git a/src/components/Map/index.tsx b/src/components/Map/index.tsx index b828706d..48e294d8 100644 --- a/src/components/Map/index.tsx +++ b/src/components/Map/index.tsx @@ -32,6 +32,8 @@ import { useMaplibreMap } from '@lib/hooks/useMaplibreMap' import { useFiltersWithActiveProp } from '@lib/hooks/useFiltersWithActiveProp' import { getActiveLabelGroups, isFacilityActive } from '@lib/facilityFilterUtil' import { useActiveIdsBySearchTerm } from '@lib/hooks/useActiveIdsBySearchTerm' +import colors from 'src/colors' +import { getCategoryColorMatchQuery } from '@lib/facilityColorUtil' interface MapType { markers?: MinimalRecordType[] @@ -323,13 +325,8 @@ export const FacilitiesMap: FC = ({ paint: { 'circle-radius': 10, 'circle-stroke-width': 1, - 'circle-stroke-color': '#FAFAFF', - 'circle-color': [ - 'case', - ['boolean', ['feature-state', 'hover'], false], - '#999999', - '#773666', - ], + 'circle-stroke-color': colors.white, + 'circle-color': getCategoryColorMatchQuery(), 'circle-stroke-opacity': opacityGlCondition, 'circle-opacity': opacityGlCondition, }, diff --git a/src/lib/facilityColorUtil.ts b/src/lib/facilityColorUtil.ts new file mode 100644 index 00000000..fda51e7e --- /dev/null +++ b/src/lib/facilityColorUtil.ts @@ -0,0 +1,45 @@ +import { MinimalRecordType } from './mapRecordToMinimum' +import colors from '../colors' +import { + DataDrivenPropertyValueSpecification, + ExpressionInputType, + ExpressionSpecification, +} from 'maplibre-gl' + +export const facilityTypeColorMap = { + Beratung: colors.type.categoryAdvising, + Selbsthilfe: colors.type.categorySelfHelp, + Amt: colors.type.categoryDistrictOfficeHelp, + Online: colors.type.categoryOnlineOffers, + Klinik: colors.type.categoryClinics, +} +export function getCategoryColorMatchQuery(): + | DataDrivenPropertyValueSpecification + | undefined { + return [ + 'case', + ['boolean', ['feature-state', 'hover'], false], + '#999999', + getFacilityTypeColorMatchQuery(), + ] +} + +export const getFacilityTypeColor = ( + facilityType: MinimalRecordType['type'] +): string => facilityTypeColorMap[facilityType] + +function getFacilityTypeColorMatchQuery(): + | ExpressionSpecification + | ExpressionInputType { + return [ + 'match', + ['get', 'type'], + ...Object.entries(facilityTypeColorMap).reduce( + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + (acc, [key, value]) => [...acc, key, value], + [] + ), + colors.gray[40], + ] +} diff --git a/src/lib/mapRecordToMinimum.ts b/src/lib/mapRecordToMinimum.ts index a17fce1a..5a8b8a2e 100644 --- a/src/lib/mapRecordToMinimum.ts +++ b/src/lib/mapRecordToMinimum.ts @@ -23,6 +23,7 @@ export interface MinimalRecordType phone: string description: string website: string + type: 'Beratung' | 'Klinik' | 'Selbsthilfe' | 'Amt' | 'Online' } export const mapRecordToMinimum = (record: TableRowType): MinimalRecordType => { @@ -44,6 +45,7 @@ export const mapRecordToMinimum = (record: TableRowType): MinimalRecordType => { }), phone: record.fields.Telefonnummer, website: record.fields.Website, + type: record.fields.Typ, } } diff --git a/tailwind.config.js b/tailwind.config.js index 6ab71e7a..b46fcd7e 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -1,4 +1,5 @@ const { join } = require('path') +const colors = require('./src/colors') module.exports = { content: [ @@ -6,31 +7,7 @@ module.exports = { join(__dirname, './src/**/*.{js,ts,jsx,tsx}'), ], theme: { - colors: { - purple: { - 50: '#F9F1F7', - 200: '#ECD5E6', - 400: '#8D3F78', - 500: '#773666', - 700: '#4A1A3E', - }, - // TODO: Note that currently primary and purple-500 are the same. - // When there is time for refactoring, we should use the purple scale everywhere. - primary: '#773666', - black: '#0A1045', - success: '#4f9033', - info: '#5891C3', - gray: { - '10': '#EFEFEF', - '20': '#CCCCCC', - '40': '#999999', - '60': '#666666', - '80': '#333333', - }, - white: '#FFF', - trasparent: 'transparent', - currentColor: 'currentColor', - }, + colors, extend: { fontFamily: { sans: [ From 93b1fb9b920fa2ce474f0b1615306f7915702849 Mon Sep 17 00:00:00 2001 From: Lucas Vogel Date: Tue, 15 Aug 2023 17:50:34 +0200 Subject: [PATCH 54/76] feat(FacilityType): Show facility type pill in filters and FacilityListItem --- next.config.js | 1 - src/colors.js | 4 +- src/components/Checkbox.tsx | 10 ++-- src/components/FacilityListItem.tsx | 26 +++++++--- src/components/FacilityType.tsx | 28 +++++++++++ src/components/Map/index.tsx | 4 +- src/components/TextSearch.tsx | 33 ++++++++----- src/lib/facilityColorUtil.ts | 45 ----------------- src/lib/facilityTypeUtil.ts | 76 +++++++++++++++++++++++++++++ tailwind.config.js | 1 - 10 files changed, 153 insertions(+), 75 deletions(-) create mode 100644 src/components/FacilityType.tsx delete mode 100644 src/lib/facilityColorUtil.ts create mode 100644 src/lib/facilityTypeUtil.ts diff --git a/next.config.js b/next.config.js index 43026471..9077fbb2 100644 --- a/next.config.js +++ b/next.config.js @@ -1,7 +1,6 @@ /** @type {import('next').NextConfig} */ const nextConfig = { reactStrictMode: true, - scrollRestoration: true, // swcMinify: false, } diff --git a/src/colors.js b/src/colors.js index fdbad895..553d7a6d 100644 --- a/src/colors.js +++ b/src/colors.js @@ -20,8 +20,8 @@ module.exports = { '80': '#333333', }, type: { - categorySelfHelp: '#834375', - categoryAdvising: '#91CE41', + categoryAdvising: '#834375', + categorySelfHelp: '#91CE41', categoryClinics: '#BC748B', categoryDistrictOfficeHelp: '#BC8746', categoryOnlineOffers: '#6969F3', diff --git a/src/components/Checkbox.tsx b/src/components/Checkbox.tsx index f10b51a4..17764cd1 100644 --- a/src/components/Checkbox.tsx +++ b/src/components/Checkbox.tsx @@ -3,15 +3,15 @@ import React from 'react' interface CheckboxProps extends React.InputHTMLAttributes { id?: string - labelText?: string + children?: JSX.Element | JSX.Element[] | null } let idCounter = 0 function Checkbox({ id = `Checkbox-${idCounter++}`, - labelText, className, + children, ...props }: CheckboxProps): JSX.Element { const checkbox = ( @@ -28,11 +28,11 @@ function Checkbox({ {...props} /> ) - if (!labelText) return checkbox + if (!children) return checkbox return ( -
+ } + header={} + footer={ +
+ +
+ } + > +

{facility.description}

+ + ) +} diff --git a/src/components/FacilityInfo/index.tsx b/src/components/FacilityInfo/index.tsx index 6ac42d48..9b8119b1 100644 --- a/src/components/FacilityInfo/index.tsx +++ b/src/components/FacilityInfo/index.tsx @@ -1,6 +1,5 @@ import { FC, ReactNode } from 'react' import { TableRowType } from '@common/types/gristData' -import { useDistanceToUser } from '@lib/hooks/useDistanceToUser' import { useIsFacilityOpened } from '@lib/hooks/useIsFacilityOpened' import { useTexts } from '@lib/TextsContext' import { mapRecordToMinimum } from '@lib/mapRecordToMinimum' @@ -17,6 +16,7 @@ import { Accessible } from '@components/icons/Accessible' import Link from 'next/link' import { FacilityLabels } from '@components/FacilityLabels' import { splitString } from '@lib/splitString' +import FacilitySecondaryInfos from '@components/FacilitySecondaryInfos' interface FacilityInfoType { facility: TableRowType @@ -47,11 +47,6 @@ export const FacilityInfo: FC = ({ facility }) => { const texts = useTexts() const parsedFacilty = mapRecordToMinimum(facility) const isOpened = useIsFacilityOpened(parsedFacilty) - const { getDistanceToUser } = useDistanceToUser() - const distance = getDistanceToUser({ - latitude: facility.fields.lat, - longitude: facility.fields.long, - }) const { allLabels } = useRecordLabels(facility.fields.Schlagworte) const { Strasse, Hausnummer, PLZ, Zusatz, Art_der_Anmeldung } = @@ -135,17 +130,7 @@ export const FacilityInfo: FC = ({ facility }) => {

{facility.fields.Einrichtung}

- {(distance || isOpened) && ( -
- {isOpened && ( - - - {texts.opened} - - )} - {distance && {distance} km} -
- )} + {facility.fields.Uber_uns.length > 1 && (

= ({ }) => { const [urlState] = useUrlState() const texts = useTexts() - const open = useIsFacilityOpened(facility) - const { getDistanceToUser } = useDistanceToUser() - const distance = getDistanceToUser({ - latitude: facility.latitude, - longitude: facility.longitude, - }) const phone: string | undefined = facility.phone?.split(',')[0] - const type = facility.type return ( - {(distance || type) && ( -

- {type && } - {distance && {distance} km} -
- )} - - {open && ( -

- - - {texts.opened} - -

- )} - - ) - } + header={} footer={
{phone && ( diff --git a/src/components/FacilitySecondaryInfos.tsx b/src/components/FacilitySecondaryInfos.tsx new file mode 100644 index 00000000..255f1a2b --- /dev/null +++ b/src/components/FacilitySecondaryInfos.tsx @@ -0,0 +1,39 @@ +import { useTexts } from '@lib/TextsContext' +import { useDistanceToUser } from '@lib/hooks/useDistanceToUser' +import { useIsFacilityOpened } from '@lib/hooks/useIsFacilityOpened' +import { MinimalRecordType } from '@lib/mapRecordToMinimum' +import React from 'react' +import FacilityType from './FacilityType' + +interface FacilitySecondaryInfosProps { + facility: MinimalRecordType +} + +function FacilitySecondaryInfos({ + facility, +}: FacilitySecondaryInfosProps): JSX.Element | null { + const texts = useTexts() + const open = useIsFacilityOpened(facility) + const { getDistanceToUser } = useDistanceToUser() + const distance = getDistanceToUser({ + latitude: facility.latitude, + longitude: facility.longitude, + }) + const type = facility.type + + if (!open && !distance && !type) return null + return ( +

+ {type && } + {distance && {distance} km} + {open && ( + + + {texts.opened} + + )} +

+ ) +} + +export default FacilitySecondaryInfos diff --git a/src/components/FacilityType.tsx b/src/components/FacilityType.tsx index e9e61098..545aaf85 100644 --- a/src/components/FacilityType.tsx +++ b/src/components/FacilityType.tsx @@ -1,7 +1,7 @@ import { useTexts } from '@lib/TextsContext' import classNames from '@lib/classNames' import { - facilityTypeColorMap, + getColorByFacilityType, getTextKeyByFacilityType, } from '@lib/facilityTypeUtil' import { MinimalRecordType } from '@lib/mapRecordToMinimum' @@ -13,11 +13,11 @@ function FacilityType({ }): JSX.Element { const texts = useTexts() return ( - + {texts[getTextKeyByFacilityType(type)]} diff --git a/src/components/Map/index.tsx b/src/components/Map/index.tsx index 8c4f05ef..44a918e1 100644 --- a/src/components/Map/index.tsx +++ b/src/components/Map/index.tsx @@ -33,7 +33,10 @@ import { useFiltersWithActiveProp } from '@lib/hooks/useFiltersWithActiveProp' import { getActiveLabelGroups, isFacilityActive } from '@lib/facilityFilterUtil' import { useActiveIdsBySearchTerm } from '@lib/hooks/useActiveIdsBySearchTerm' import colors from '../../colors' -import { getCategoryColorMatchQuery } from '@lib/facilityTypeUtil' +import { + getCategoryColorMatchQuery, + getColorByFacilityType, +} from '@lib/facilityTypeUtil' interface MapType { markers?: MinimalRecordType[] @@ -41,11 +44,7 @@ interface MapType { onMarkerClick?: (facilities: MinimalRecordType[]) => void onClickAnywhere?: () => void onMoveStart?: () => void - /** An optional array of [longitude, latitude]. - * If provided, the map's center will be forced to this location. - * Also, a highlighted marker will be drawn to the map. - */ - highlightedCenter?: [longitude: number, latitude: number] + highlightedFacility?: MinimalRecordType } const easeInOutQuad = (t: number): number => @@ -71,7 +70,7 @@ export const FacilitiesMap: FC = ({ onMarkerClick = () => undefined, onClickAnywhere = () => undefined, onMoveStart = () => undefined, - highlightedCenter, + highlightedFacility, }) => { const { query, push } = useRouter() const texts = useTexts() @@ -100,11 +99,12 @@ export const FacilitiesMap: FC = ({ id && isSpiderfied && spiderifier.current?.expandedIds.includes(id) const highlightedMarkerViewport = - highlightedCenter && !currentFacilityIdPageIsSpiderfied + highlightedFacility && !currentFacilityIdPageIsSpiderfied ? { - latitude: highlightedCenter[1], - longitude: highlightedCenter[0], + latitude: highlightedFacility.latitude, + longitude: highlightedFacility.longitude, zoom: MAP_CONFIG.zoomedInZoom, + color: getColorByFacilityType(highlightedFacility.type), } : null const highlightedMarker = useMapHighlightMarker( diff --git a/src/components/Map/popupUtils.ts b/src/components/Map/popupUtils.ts index bb28809e..d7ce14a2 100644 --- a/src/components/Map/popupUtils.ts +++ b/src/components/Map/popupUtils.ts @@ -1,3 +1,5 @@ +import classNames from '@lib/classNames' +import { FacilityType, getColorByFacilityType } from '@lib/facilityTypeUtil' import { isFacilityOpened } from '@lib/hooks/useIsFacilityOpened' import { MinimalRecordType } from '@lib/mapRecordToMinimum' import { TextsMapType } from '@lib/TextsContext' @@ -10,7 +12,7 @@ export function getPopupHTML( const facility = facilities[0] const isOpened = isFacilityOpened(facility) return ` - ${getTitleHTML(facility.title)} + ${getTitleHTML(facility.title, facility.type)} ${ (isOpened && ` @@ -33,10 +35,20 @@ export function getPopupHTML( ` } -function getTitleHTML(title: string): string { +function getTitleHTML(title: string, type?: FacilityType): string { return ` -

+

+ ${title} + + ${ + type + ? `` + : '' + }

` } @@ -58,7 +70,7 @@ function getMultipleFacilitiesHTML( `)} ${facilities .slice(0, max) - .map((facility) => getRowHTML(facility.title)) + .map((facility) => getRowHTML(facility.title, facility.type)) .join('\n')} ${ facilities.length > max @@ -70,13 +82,24 @@ function getMultipleFacilitiesHTML( ` } -function getRowHTML(title: string): string { +function getRowHTML(title: string, type?: FacilityType): string { return `
- ${title} + ${ + type + ? `` + : '' + } + ${title}
` } diff --git a/src/components/MapLayout.tsx b/src/components/MapLayout.tsx index 9a3426d9..77f3b0f4 100644 --- a/src/components/MapLayout.tsx +++ b/src/components/MapLayout.tsx @@ -27,9 +27,7 @@ export const MapLayout: FC<{ const { query, pathname, isFallback } = useRouter() const texts = useTexts() const [listViewOpen, setListViewOpen] = useState(true) - const [mapCenter, setMapCenter] = useState< - [lng: number, lat: number] | undefined - >() + const [selectedFacility, setSelectedFacility] = useState() const [selectedFacilities, setSelectedFacilities] = useState< MinimalRecordType[] >([]) @@ -64,13 +62,13 @@ export const MapLayout: FC<{ useEffect(() => { setSelectedFacilities([]) if (!query.id || typeof query.id !== 'string') { - setMapCenter(undefined) + setSelectedFacility(undefined) return } const currentId = parseInt(`${query.id}`, 10) const currentRecord = records.find(({ id }) => id === currentId) if (!currentRecord) return - setMapCenter([currentRecord.longitude, currentRecord.latitude]) + setSelectedFacility(currentRecord) }, [query.id, records]) const updateSidebarVisibility = useCallback( @@ -117,7 +115,7 @@ export const MapLayout: FC<{ onClickAnywhere={() => { setSelectedFacilities([]) }} - highlightedCenter={mapCenter} + highlightedFacility={selectedFacility} /> {[selectedFacilities[0]].filter(Boolean).map(({ id }) => (
+export const getColorByFacilityType = (facilityType: FacilityType): string => colors.type[getKeyByFacilityType(facilityType)] export const getTextKeyByFacilityType = ( @@ -40,7 +40,7 @@ export const getTextKeyByFacilityType = ( facilityTypeToKeyMap[facilityType] )}` as keyof TextsMapType -export const facilityTypeColorMap = facilityTypes.reduce( +const facilityTypeColorMap = facilityTypes.reduce( (acc, facilityType) => ({ ...acc, [facilityType]: getColorByFacilityType(facilityType), diff --git a/src/lib/hooks/useMapHighlightMarker.ts b/src/lib/hooks/useMapHighlightMarker.ts index bdf12291..30ac5bc3 100644 --- a/src/lib/hooks/useMapHighlightMarker.ts +++ b/src/lib/hooks/useMapHighlightMarker.ts @@ -3,9 +3,13 @@ import { ViewportType } from '@lib/types/map' import { LngLatLike, Map, Marker } from 'maplibre-gl' import { useEffect, useRef } from 'react' +interface MarkerProps extends ViewportType { + color: string +} + export function useMapHighlightMarker( map: Map | null, - markerViewport: ViewportType | null + markerViewport: MarkerProps | null ): Marker | null { const highlightedMarker = useRef(null) @@ -20,6 +24,7 @@ export function useMapHighlightMarker( 'w-10 h-10 bg-primary rounded-full ring-2', 'ring-offset-white ring-offset-2 ring-primary' ) + customMarker.style.backgroundColor = markerViewport.color const markerCenter = [ markerViewport.longitude, From 4440ca39d4818acbd02224e20b0d4567c3fb3df8 Mon Sep 17 00:00:00 2001 From: Lucas Vogel Date: Wed, 16 Aug 2023 13:23:30 +0200 Subject: [PATCH 56/76] feat(mapUtil): Also colorize the markers in spiderified state --- src/components/Map/index.tsx | 18 ++++++++++++++---- src/components/Map/mapUtil.ts | 7 +++++++ styles/globals.css | 1 + 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/components/Map/index.tsx b/src/components/Map/index.tsx index 44a918e1..f863a88d 100644 --- a/src/components/Map/index.tsx +++ b/src/components/Map/index.tsx @@ -47,6 +47,14 @@ interface MapType { highlightedFacility?: MinimalRecordType } +type SpiderifierMarkerType = InstanceType< + typeof MaplibreglSpiderifier< + MinimalRecordType & { + color?: string + } + > +> + const easeInOutQuad = (t: number): number => t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1 @@ -85,8 +93,7 @@ export const FacilitiesMap: FC = ({ const [isSpiderfied, setIsSpiderfied] = useState(false) const markerClickHandler = useRef(() => undefined) const clusterClickHandler = useRef(() => undefined) - const spiderifier = - useRef>>(null) + const spiderifier = useRef(null) const map = useMaplibreMap({ containerId: 'map', ...MAP_CONFIG }) const labels = useFiltersWithActiveProp() @@ -280,7 +287,10 @@ export const FacilitiesMap: FC = ({ popup.current?.remove.bind(popup.current)() spiderifier.current.spiderfy( firstFeature.geometry.coordinates, - clickedFacilities, + clickedFacilities.map((f) => ({ + ...f, + color: getColorByFacilityType(f.type), + })), typeof query.id === 'string' ? query.id : undefined ) spiderifier.current?.expandedIds.forEach((id) => { @@ -288,7 +298,7 @@ export const FacilitiesMap: FC = ({ }) setIsSpiderfied(true) } - }, [query.id, markers, map]) + }, [query.id, markers, map, onMarkerClick]) useEffect(() => { if (!mapStylesLoaded || !markers || !map) return diff --git a/src/components/Map/mapUtil.ts b/src/components/Map/mapUtil.ts index 6e818456..2c21e4e4 100644 --- a/src/components/Map/mapUtil.ts +++ b/src/components/Map/mapUtil.ts @@ -6,6 +6,7 @@ import { MinimalRecordType } from '@lib/mapRecordToMinimum' import { TextsMapType } from '@lib/TextsContext' import { LngLat, Map, LngLatLike, Popup } from 'maplibre-gl' import { getPopupHTML } from './popupUtils' +import { getColorByFacilityType } from '@lib/facilityTypeUtil' export type MarkerClickHandlerType = (facility: MinimalRecordType) => void export type ClusterClickHandlerType = ( @@ -37,6 +38,12 @@ export function getSpiderfier(config: { popup.setOffset(0) popup.remove() }, + initializeMarker({ elements, marker }) { + elements.parent.style.setProperty( + `--markerColor`, + getColorByFacilityType(marker.type) + ) + }, }) } diff --git a/styles/globals.css b/styles/globals.css index ba6d2088..5a87f4a8 100644 --- a/styles/globals.css +++ b/styles/globals.css @@ -88,6 +88,7 @@ html .maplibregl-map { @apply absolute z-10 border border-white rounded-full bg-primary -translate-x-1/2 -translate-y-1/2 transition-colors; width: 22px; height: 22px; + background-color: var(--markerColor); } .spidered-marker .icon-div.active::before { From 2e092630724a012da20a3755c6e945e264a94434 Mon Sep 17 00:00:00 2001 From: Lucas Vogel Date: Wed, 16 Aug 2023 13:39:02 +0200 Subject: [PATCH 57/76] feat(FacilitySecondaryInfos): Don't show distance and opened status if online offer --- src/components/FacilitySecondaryInfos.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/FacilitySecondaryInfos.tsx b/src/components/FacilitySecondaryInfos.tsx index 255f1a2b..2bd94494 100644 --- a/src/components/FacilitySecondaryInfos.tsx +++ b/src/components/FacilitySecondaryInfos.tsx @@ -20,13 +20,14 @@ function FacilitySecondaryInfos({ longitude: facility.longitude, }) const type = facility.type + const isOnlineOffer = facility.type === 'Online' if (!open && !distance && !type) return null return (

{type && } - {distance && {distance} km} - {open && ( + {distance && !isOnlineOffer && {distance} km} + {open && !isOnlineOffer && ( {texts.opened} From 4878c86d6b89b4a4437e2d5dcd1a6c826e2924aa Mon Sep 17 00:00:00 2001 From: Lucas Vogel Date: Wed, 16 Aug 2023 16:28:36 +0200 Subject: [PATCH 58/76] refactor(FacilitiesMap): Remove unnecessary color prop on markers --- src/components/Map/index.tsx | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/components/Map/index.tsx b/src/components/Map/index.tsx index f863a88d..cd024f33 100644 --- a/src/components/Map/index.tsx +++ b/src/components/Map/index.tsx @@ -287,10 +287,7 @@ export const FacilitiesMap: FC = ({ popup.current?.remove.bind(popup.current)() spiderifier.current.spiderfy( firstFeature.geometry.coordinates, - clickedFacilities.map((f) => ({ - ...f, - color: getColorByFacilityType(f.type), - })), + clickedFacilities, typeof query.id === 'string' ? query.id : undefined ) spiderifier.current?.expandedIds.forEach((id) => { From c273a331b0aba82912b27670e024cc65f94f8f3b Mon Sep 17 00:00:00 2001 From: Lucas Vogel Date: Thu, 17 Aug 2023 01:39:55 +0200 Subject: [PATCH 59/76] feat(useClusterMarkers): Add cluster markers to the map --- src/components/Map/index.tsx | 13 ++++ src/components/Map/mapUtil.ts | 62 +++++++++++++++++- src/lib/hooks/useClusterMarkers.ts | 100 +++++++++++++++++++++++++++++ 3 files changed, 172 insertions(+), 3 deletions(-) create mode 100644 src/lib/hooks/useClusterMarkers.ts diff --git a/src/components/Map/index.tsx b/src/components/Map/index.tsx index cd024f33..b8cb36e2 100644 --- a/src/components/Map/index.tsx +++ b/src/components/Map/index.tsx @@ -37,6 +37,7 @@ import { getCategoryColorMatchQuery, getColorByFacilityType, } from '@lib/facilityTypeUtil' +import useClusterMarkers from '@lib/hooks/useClusterMarkers' interface MapType { markers?: MinimalRecordType[] @@ -134,6 +135,12 @@ export const FacilitiesMap: FC = ({ useMapUserGeolocationMarker(map, MAP_CONFIG.zoomedInZoom, mapLayersLoaded) + useClusterMarkers({ + map, + markers, + mapLayersLoaded, + }) + useOnMapFeatureMove(map, 'unclustered-point', (features) => { if (!map) return const isMobile = window.innerWidth <= MOBILE_BREAKPOINT @@ -211,6 +218,12 @@ export const FacilitiesMap: FC = ({ // eslint-disable-next-line react-hooks/exhaustive-deps }, [map, markers, joinedLabelIds, mapLayersLoaded, activeIdsBySearchTerm.key]) + useClusterMarkers({ + map, + markers, + mapLayersLoaded, + }) + useEffect(() => { if (!map) return markerClickHandler.current = (facility: MinimalRecordType): void => { diff --git a/src/components/Map/mapUtil.ts b/src/components/Map/mapUtil.ts index 2c21e4e4..5479d2fe 100644 --- a/src/components/Map/mapUtil.ts +++ b/src/components/Map/mapUtil.ts @@ -4,7 +4,7 @@ import MaplibreglSpiderifier, { } from '@lib/MaplibreglSpiderifier' import { MinimalRecordType } from '@lib/mapRecordToMinimum' import { TextsMapType } from '@lib/TextsContext' -import { LngLat, Map, LngLatLike, Popup } from 'maplibre-gl' +import { LngLat, Map as MaplibreMap, LngLatLike, Popup } from 'maplibre-gl' import { getPopupHTML } from './popupUtils' import { getColorByFacilityType } from '@lib/facilityTypeUtil' @@ -15,7 +15,7 @@ export type ClusterClickHandlerType = ( export function getSpiderfier(config: { popup: Popup - map: Map + map: MaplibreMap clickHandler: MarkerClickHandlerType texts: TextsMapType }): MaplibreglSpiderifier { @@ -61,8 +61,64 @@ export function getFeaturesOnSameCoordsThanFirstOne( }) } +function getFacilitiesOnSameCoordsThanFirstOne( + facility: MinimalRecordType, + facilities: MinimalRecordType[] +): MinimalRecordType[] { + const pointACoords = [facility.longitude, facility.latitude] as [ + number, + number + ] + const pointA = new LngLat(...pointACoords) + return facilities.filter((feat) => { + const coordinates = [feat.longitude, feat.latitude] as [number, number] + const pointB = new LngLat(...coordinates) + const dist = pointA.distanceTo(pointB) + const distance = Math.round(dist / 100) / 10 + return distance < 0.1 + }) +} + +export type ClusterType = { + id: string + facilities: MinimalRecordType[] + includedTypes: MinimalRecordType['type'][] +} +type ClusterMapType = Map +export function getClusteredFacilities( + facilities: MinimalRecordType[] +): ClusterType[] { + const clusters: ClusterMapType = new Map() + const alreadySearchedIds: Set = new Set() + + facilities.forEach((facility) => { + if (alreadySearchedIds.has(facility.id)) return + const facilitiesOnSameCoords = getFacilitiesOnSameCoordsThanFirstOne( + facility, + facilities + ) + if (facilitiesOnSameCoords.length > 1) { + clusters.set(`${facility.id}`, { + id: `${facility.id}`, + facilities: facilitiesOnSameCoords, + includedTypes: [ + ...facilitiesOnSameCoords + .reduce( + (acc, curr) => acc.add(curr.type), + new Set() + ) + .values(), + ], + }) + } + facilitiesOnSameCoords.forEach((f) => alreadySearchedIds.add(f.id)) + }) + + return [...clusters.values()] +} + export function zoomIn( - map: Map, + map: MaplibreMap, coordinates?: LngLatLike, zoomIncrease = 1, maxZoom = 17 diff --git a/src/lib/hooks/useClusterMarkers.ts b/src/lib/hooks/useClusterMarkers.ts new file mode 100644 index 00000000..daf2b3af --- /dev/null +++ b/src/lib/hooks/useClusterMarkers.ts @@ -0,0 +1,100 @@ +import { ClusterType, getClusteredFacilities } from '@components/Map/mapUtil' +import { useEffect, useRef } from 'react' +import { Map as MaptilerMap, Marker } from 'maplibre-gl' +import { MinimalRecordType } from '@lib/mapRecordToMinimum' +import { getColorByFacilityType } from '@lib/facilityTypeUtil' + +interface UseClusterMarkersProps { + map: MaptilerMap | null + markers?: MinimalRecordType[] + mapLayersLoaded: boolean +} + +function useClusterMarkers({ + map, + markers, + mapLayersLoaded, +}: UseClusterMarkersProps): void { + const isInitialized = useRef(false) + + useEffect(() => { + if (isInitialized.current) return + if (!map || !markers || !mapLayersLoaded) return + + const clusters = getClusteredFacilities(markers) + clusters.forEach((cluster) => { + const firstFacility = cluster.facilities[0] + const { longitude, latitude } = firstFacility + const marker = new Marker(getClusterHTMLElement(cluster)) + marker.setLngLat([longitude, latitude]) + marker.addTo(map) + }) + + isInitialized.current = true + }, [map, markers, mapLayersLoaded]) +} + +function getClusterHTMLElement(cluster: ClusterType): HTMLButtonElement { + const parentButton = document.createElement('button') + parentButton.classList.add( + `w-[34px]`, + `h-[34px]`, + `rounded-full`, + `-translate-x-1/2`, + `-translate-y-1/2` + ) + parentButton.innerHTML = getClusterSVG(cluster) + return parentButton +} + +function getClusterSVG(cluster: ClusterType): string { + const { includedTypes } = cluster + const svgContent = + [ + [ + 'M17 1.5c4.28 0 8.155 1.735 10.96 4.54A15.451 15.451 0 0 1 32.5 17c0 4.28-1.735 8.155-4.54 10.96A15.451 15.451 0 0 1 17 32.5c-4.28 0-8.155-1.735-10.96-4.54A15.451 15.451 0 0 1 1.5 17c0-4.28 1.735-8.155 4.54-10.96A15.451 15.451 0 0 1 17 1.5Z', + ], + [ + 'M17.315 32.997C26.006 32.829 33 25.731 33 17c0-8.837-7.163-16-16-16v32l.315-.003Z', + 'M16.685 32.997C7.994 32.829 1 25.731 1 17 1 8.163 8.163 1 17 1v32l-.315-.003Z', + ], + [ + 'M17 1c8.837 0 16 7.163 16 16a17.15 17.15 0 0 1-2.05 8.17l-13.931-8.069L17 1Z', + 'M30.95 25.17c-4.42 7.653-14.205 10.275-21.857 5.856-2.571-1.484-4.49-3.643-5.933-5.985l13.859-7.94 13.93 8.07Z', + 'M17 1C8.163 1 1 8.163 1 17c0 2.969.911 5.71 2.217 8.131l13.802-8.03L17 1Z', + ], + [ + 'M33 17c0 8.731-6.994 15.83-15.685 15.997L17 33V17h16Z', + 'M33 17c0-8.731-6.994-15.83-15.685-15.997L17 1v16h16Z', + 'M17 17v16l-.315-.003C8.1 32.831 1.171 25.903 1.003 17.319L1 17h16Z', + 'M17 17V1l-.315.003C8.1 1.169 1.171 8.097 1.003 16.681L1 17h16Z', + ], + [ + 'm17.002 17 9.403 12.944.382-.286.128-.1A15.93 15.93 0 0 1 17 33a15.927 15.927 0 0 1-9.298-2.978l-.107-.078L16.998 17h.004Z', + 'M17 17 7.594 29.943l-.253-.187c-5.567-4.212-7.768-11.44-5.557-17.72l15.032 4.83L17 17Z', + 'm17 17 9.405 12.944.253-.187c5.567-4.212 7.768-11.44 5.557-17.72l-15.032 4.83L17 17Z', + 'M17 17V1l.315.003c6.98.135 13.01 4.69 14.912 11.07L17.226 17H17Z', + 'M17 17V1l-.315.003c-6.98.135-13.01 4.69-14.912 11.07L16.774 17H17Z', + ], + ][includedTypes.length - 1] || [] + return ` + + + ${svgContent + .map( + (_, index) => ` + + ` + ) + .join('')} + + + + ` +} + +export default useClusterMarkers From 0871d78b8e28044b48732d0cffeb521169e05569 Mon Sep 17 00:00:00 2001 From: Lucas Vogel Date: Thu, 17 Aug 2023 01:53:10 +0200 Subject: [PATCH 60/76] fix(mapUtil): Fix cluster detection range (too large) --- src/components/Map/mapUtil.ts | 4 ++-- styles/globals.css | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/components/Map/mapUtil.ts b/src/components/Map/mapUtil.ts index 5479d2fe..df480ae6 100644 --- a/src/components/Map/mapUtil.ts +++ b/src/components/Map/mapUtil.ts @@ -74,8 +74,8 @@ function getFacilitiesOnSameCoordsThanFirstOne( const coordinates = [feat.longitude, feat.latitude] as [number, number] const pointB = new LngLat(...coordinates) const dist = pointA.distanceTo(pointB) - const distance = Math.round(dist / 100) / 10 - return distance < 0.1 + const distance = dist + return distance < 1 }) } diff --git a/styles/globals.css b/styles/globals.css index 5a87f4a8..f4811bea 100644 --- a/styles/globals.css +++ b/styles/globals.css @@ -54,16 +54,16 @@ html .maplibregl-map { } .maplibregl-canvas-container canvas { - @apply focus-visible:outline-none; + @apply outline-none; } .maplibregl-canvas-container { - @apply relative w-full h-full overflow-hidden box-border focus-within:outline-none focus-within:border-2 focus-within:border-primary; + @apply relative w-full h-full overflow-hidden box-border outline-none; } -.maplibregl-canvas-container:focus-within canvas { - margin-top: -2px; - margin-left: -2px; +.maplibregl-canvas-container:has(:focus-visible):before { + content: ''; + @apply absolute inset-0 z-10 border-2 border-primary rounded-sm; } /* Spiderifier */ From a8aaff94a1e1a43b145145c8c5a5158a59ba4649 Mon Sep 17 00:00:00 2001 From: Lucas Vogel Date: Thu, 17 Aug 2023 09:41:15 +0200 Subject: [PATCH 61/76] refactor(FiltersList): Make button to Link --- src/components/Button.tsx | 47 +++++++++++++++++----------------- src/components/FiltersList.tsx | 12 +++------ 2 files changed, 26 insertions(+), 33 deletions(-) diff --git a/src/components/Button.tsx b/src/components/Button.tsx index 11ff5d8b..5bd2d80e 100644 --- a/src/components/Button.tsx +++ b/src/components/Button.tsx @@ -66,7 +66,7 @@ export const Button: FC = ({ ) const SHARED_CLASSES = classNames( - 'text-center group', + 'text-center group relative', 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2 focus-visible:ring-offset-white', SIZE_CLASSES, SCHEME_CLASSES, @@ -81,32 +81,42 @@ export const Button: FC = ({ const isInternalLink = !isExternalLink - if (isExternalLink) { - if (tooltip) - console.error('Tooltip is currently not supported for tags.') + const tooltipEl = tooltip && ( + + {tooltip} + + ) + if (isExternalLink) { return ( - + {children} {icon} + {tooltipEl} ) } - if (isInternalLink && !isButton) { - if (tooltip) - console.error('Tooltip is currently not supported for tags.') - + if (isInternalLink && !isButton && !disabled) { return ( {children} {icon} + {tooltipEl} ) } else { @@ -115,25 +125,14 @@ export const Button: FC = ({ onClick={() => onClick()} className={classNames( SHARED_CLASSES, - 'relative', - 'disabled:bg-gray-20 disabled:text-gray-60 disabled:cursor-not-allowed' + disabled && + 'disabled:bg-gray-20 disabled:text-gray-60 disabled:cursor-not-allowed' )} disabled={disabled} > {children} {icon} - {tooltip && ( - - {tooltip} - - )} + {tooltipEl} ) } diff --git a/src/components/FiltersList.tsx b/src/components/FiltersList.tsx index cec4f9e9..f9c4b4ee 100644 --- a/src/components/FiltersList.tsx +++ b/src/components/FiltersList.tsx @@ -8,7 +8,6 @@ import { useUserGeolocation } from '@lib/hooks/useUserGeolocation' import { TextsMapType, useTexts } from '@lib/TextsContext' import { FC, useEffect, useMemo, useState } from 'react' import { SwitchButton } from './SwitchButton' -import { useRouter } from 'next/router' import { useFiltersWithActiveProp } from '@lib/hooks/useFiltersWithActiveProp' import { FiltersTagsList } from './FiltersTagsList' import { @@ -26,7 +25,6 @@ export const FiltersList: FC<{ recordsWithOnlyLabels: RecordsWithOnlyLabelsType[] onSubmit?: () => void }> = ({ recordsWithOnlyLabels, onSubmit = () => undefined }) => { - const { push } = useRouter() const texts = useTexts() const labels = useFiltersWithActiveProp() const [urlState, updateUrlState] = useUrlState() @@ -200,15 +198,11 @@ export const FiltersList: FC<{ scheme="primary" size="large" className={classNames('w-full @md:w-max @md:min-w-[324px]', 'group')} + href="/map" + query={latitude && longitude ? { latitude, longitude } : {}} + tag="a" onClick={() => { onSubmit() - void push({ - pathname: '/map', - query: { - ...urlState, - ...(latitude && longitude ? { latitude, longitude } : {}), - }, - }) }} icon={ textSearchLoading ? ( From 3a3a1a7f19faabf8b283d5285c59927ef235cba9 Mon Sep 17 00:00:00 2001 From: Lucas Vogel Date: Thu, 17 Aug 2023 10:57:53 +0200 Subject: [PATCH 62/76] refactor(FacilityListItem): Show website based on type not presence in db --- src/components/FacilityListItem.tsx | 7 ++++--- src/lib/TextsContext.tsx | 1 + 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/components/FacilityListItem.tsx b/src/components/FacilityListItem.tsx index 15b78c10..99b5f4d1 100644 --- a/src/components/FacilityListItem.tsx +++ b/src/components/FacilityListItem.tsx @@ -23,6 +23,7 @@ export const FacilityListItem: FC = ({ const [urlState] = useUrlState() const texts = useTexts() const phone: string | undefined = facility.phone?.split(',')[0] + const isOnline = facility.type.toLowerCase() === 'online' return ( = ({ header={} footer={

- {phone && ( + {!isOnline && phone && ( )} - {!phone && facility.website && ( + {isOnline && facility.website && ( )}