diff --git a/.github/workflows/format-check.yml b/.github/workflows/format-check.yml index 33f61f255f..e7872ee6e9 100644 --- a/.github/workflows/format-check.yml +++ b/.github/workflows/format-check.yml @@ -13,4 +13,4 @@ jobs: with: node-version: 20 - run: npm ci - - run: npx biome check + - run: npm run formatting-check diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml index 6d1bb790ed..d6a505a9d3 100644 --- a/.github/workflows/playwright.yml +++ b/.github/workflows/playwright.yml @@ -22,7 +22,7 @@ jobs: - name: Install Playwright Browsers run: npx playwright install --with-deps webkit --only-shell - name: Run Playwright tests - run: npx playwright test + run: npm run test - uses: actions/upload-artifact@v4 if: ${{ !cancelled() }} with: diff --git a/README.md b/README.md index ebeaec7f73..aabe903a24 100644 --- a/README.md +++ b/README.md @@ -392,6 +392,7 @@ Costs involved in running and developing this web app: - SadmL (Russian) - SadmL_AI (Russian) - Schishka71 (Russian) +- seizeheures (Esperanto) - shuuji3 (Japanese) - Sky_NiniKo (French) - Steffo99 (Italian) @@ -400,6 +401,7 @@ Costs involved in running and developing this web app: - tferrermo (Spanish) - tkbremnes (Norwegian Bokmal) - tux93 (German) +- Usia (Ukrainian) - uzaylul (Turkish) - Vac31. (Lithuanian) - valtlai (Finnish) diff --git a/biome.json b/biome.json index 867634f9df..e6f5602d2f 100644 --- a/biome.json +++ b/biome.json @@ -1,5 +1,5 @@ { - "$schema": "https://biomejs.dev/schemas/2.0.0/schema.json", + "$schema": "https://biomejs.dev/schemas/2.1.2/schema.json", "vcs": { "enabled": true, "clientKind": "git", diff --git a/package-lock.json b/package-lock.json index f9d218cbbe..dd72e96c97 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,9 +14,9 @@ "@github/text-expander-element": "~2.9.2", "@iconify-icons/mingcute": "~1.2.9", "@justinribeiro/lite-youtube": "~1.8.2", - "@lingui/detect-locale": "~5.3.2", - "@lingui/macro": "~5.3.2", - "@lingui/react": "~5.3.2", + "@lingui/detect-locale": "~5.3.3", + "@lingui/macro": "~5.3.3", + "@lingui/react": "~5.3.3", "@szhsin/react-menu": "~4.4.1", "chroma-js": "~3.1.2", "compare-versions": "~6.1.1", @@ -29,11 +29,11 @@ "js-cookie": "~3.0.5", "just-debounce-it": "~3.2.0", "lz-string": "~1.5.0", - "masto": "~7.1.0", + "masto": "~7.2.0", "moize": "~6.1.6", "p-retry": "~6.2.1", "p-throttle": "~7.0.0", - "preact": "10.26.8", + "preact": "10.26.9", "punycode": "~2.3.1", "react-hotkeys-hook": "~5.1.0", "react-intersection-observer": "~9.16.0", @@ -41,6 +41,7 @@ "react-router-dom": "6.6.2", "string-length": "6.0.0", "swiped-events": "~1.2.0", + "temml": "~0.11.9", "tinyld": "~1.3.4", "toastify-js": "~1.12.0", "uid": "~2.0.2", @@ -50,22 +51,22 @@ "valtio": "2.1.5" }, "devDependencies": { - "@biomejs/biome": "2.0.0", - "@lingui/babel-plugin-lingui-macro": "~5.3.2", - "@lingui/cli": "~5.3.2", - "@lingui/vite-plugin": "~5.3.2", - "@playwright/test": "~1.53.0", - "@preact/preset-vite": "~2.10.1", - "@types/node": "~24.0.2", - "postcss": "~8.5.5", + "@biomejs/biome": "2.1.2", + "@lingui/babel-plugin-lingui-macro": "~5.3.3", + "@lingui/cli": "~5.3.3", + "@lingui/vite-plugin": "~5.3.3", + "@playwright/test": "~1.54.1", + "@preact/preset-vite": "~2.10.2", + "@types/node": "~24.0.14", + "postcss": "~8.5.6", "postcss-dark-theme-class": "~1.3.0", - "postcss-preset-env": "~10.2.3", - "sonda": "~0.8.0", + "postcss-preset-env": "~10.2.4", + "sonda": "~0.9.0", "twitter-text": "~3.1.0", - "vite": "~6.3.5", + "vite": "~7.0.5", "vite-plugin-generate-file": "~0.3.1", "vite-plugin-html-config": "~2.0.2", - "vite-plugin-pwa": "~1.0.0", + "vite-plugin-pwa": "~1.0.1", "vite-plugin-remove-console": "~2.2.0", "vite-plugin-run": "~0.6.1", "workbox-cacheable-response": "~7.3.0", @@ -1604,9 +1605,9 @@ } }, "node_modules/@biomejs/biome": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.0.0.tgz", - "integrity": "sha512-BlUoXEOI/UQTDEj/pVfnkMo8SrZw3oOWBDrXYFT43V7HTkIUDkBRY53IC5Jx1QkZbaB+0ai1wJIfYwp9+qaJTQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.1.2.tgz", + "integrity": "sha512-yq8ZZuKuBVDgAS76LWCfFKHSYIAgqkxVB3mGVVpOe2vSkUTs7xG46zXZeNPRNVjiJuw0SZ3+J2rXiYx0RUpfGg==", "dev": true, "license": "MIT OR Apache-2.0", "bin": { @@ -1620,20 +1621,20 @@ "url": "https://opencollective.com/biome" }, "optionalDependencies": { - "@biomejs/cli-darwin-arm64": "2.0.0", - "@biomejs/cli-darwin-x64": "2.0.0", - "@biomejs/cli-linux-arm64": "2.0.0", - "@biomejs/cli-linux-arm64-musl": "2.0.0", - "@biomejs/cli-linux-x64": "2.0.0", - "@biomejs/cli-linux-x64-musl": "2.0.0", - "@biomejs/cli-win32-arm64": "2.0.0", - "@biomejs/cli-win32-x64": "2.0.0" + "@biomejs/cli-darwin-arm64": "2.1.2", + "@biomejs/cli-darwin-x64": "2.1.2", + "@biomejs/cli-linux-arm64": "2.1.2", + "@biomejs/cli-linux-arm64-musl": "2.1.2", + "@biomejs/cli-linux-x64": "2.1.2", + "@biomejs/cli-linux-x64-musl": "2.1.2", + "@biomejs/cli-win32-arm64": "2.1.2", + "@biomejs/cli-win32-x64": "2.1.2" } }, "node_modules/@biomejs/cli-darwin-arm64": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.0.0.tgz", - "integrity": "sha512-QvqWYtFFhhxdf8jMAdJzXW+Frc7X8XsnHQLY+TBM1fnT1TfeV/v9vsFI5L2J7GH6qN1+QEEJ19jHibCY2Ypplw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.1.2.tgz", + "integrity": "sha512-leFAks64PEIjc7MY/cLjE8u5OcfBKkcDB0szxsWUB4aDfemBep1WVKt0qrEyqZBOW8LPHzrFMyDl3FhuuA0E7g==", "cpu": [ "arm64" ], @@ -1648,9 +1649,9 @@ } }, "node_modules/@biomejs/cli-darwin-x64": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.0.0.tgz", - "integrity": "sha512-5JFhls1EfmuIH4QGFPlNpxJQFC6ic3X1ltcoLN+eSRRIPr6H/lUS1ttuD0Fj7rPgPhZqopK/jfH8UVj/1hIsQw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.1.2.tgz", + "integrity": "sha512-Nmmv7wRX5Nj7lGmz0FjnWdflJg4zii8Ivruas6PBKzw5SJX/q+Zh2RfnO+bBnuKLXpj8kiI2x2X12otpH6a32A==", "cpu": [ "x64" ], @@ -1665,9 +1666,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.0.0.tgz", - "integrity": "sha512-BAH4QVi06TzAbVchXdJPsL0Z/P87jOfes15rI+p3EX9/EGTfIjaQ9lBVlHunxcmoptaA5y1Hdb9UYojIhmnjIw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.1.2.tgz", + "integrity": "sha512-NWNy2Diocav61HZiv2enTQykbPP/KrA/baS7JsLSojC7Xxh2nl9IczuvE5UID7+ksRy2e7yH7klm/WkA72G1dw==", "cpu": [ "arm64" ], @@ -1682,9 +1683,9 @@ } }, "node_modules/@biomejs/cli-linux-arm64-musl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.0.0.tgz", - "integrity": "sha512-Bxsz8ki8+b3PytMnS5SgrGV+mbAWwIxI3ydChb/d1rURlJTMdxTTq5LTebUnlsUWAX6OvJuFeiVq9Gjn1YbCyA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.1.2.tgz", + "integrity": "sha512-qgHvafhjH7Oca114FdOScmIKf1DlXT1LqbOrrbR30kQDLFPEOpBG0uzx6MhmsrmhGiCFCr2obDamu+czk+X0HQ==", "cpu": [ "arm64" ], @@ -1699,9 +1700,9 @@ } }, "node_modules/@biomejs/cli-linux-x64": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.0.0.tgz", - "integrity": "sha512-09PcOGYTtkopWRm6mZ/B6Mr6UHdkniUgIG/jLBv+2J8Z61ezRE+xQmpi3yNgUrFIAU4lPA9atg7mhvE/5Bo7Wg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.1.2.tgz", + "integrity": "sha512-Km/UYeVowygTjpX6sGBzlizjakLoMQkxWbruVZSNE6osuSI63i4uCeIL+6q2AJlD3dxoiBJX70dn1enjQnQqwA==", "cpu": [ "x64" ], @@ -1716,9 +1717,9 @@ } }, "node_modules/@biomejs/cli-linux-x64-musl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.0.0.tgz", - "integrity": "sha512-tiQ0ABxMJb9I6GlfNp0ulrTiQSFacJRJO8245FFwE3ty3bfsfxlU/miblzDIi+qNrgGsLq5wIZcVYGp4c+HXZA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.1.2.tgz", + "integrity": "sha512-xlB3mU14ZUa3wzLtXfmk2IMOGL+S0aHFhSix/nssWS/2XlD27q+S6f0dlQ8WOCbYoXcuz8BCM7rCn2lxdTrlQA==", "cpu": [ "x64" ], @@ -1733,9 +1734,9 @@ } }, "node_modules/@biomejs/cli-win32-arm64": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.0.0.tgz", - "integrity": "sha512-vrTtuGu91xNTEQ5ZcMJBZuDlqr32DWU1r14UfePIGndF//s2WUAmer4FmgoPgruo76rprk37e8S2A2c0psXdxw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.1.2.tgz", + "integrity": "sha512-G8KWZli5ASOXA3yUQgx+M4pZRv3ND16h77UsdunUL17uYpcL/UC7RkWTdkfvMQvogVsAuz5JUcBDjgZHXxlKoA==", "cpu": [ "arm64" ], @@ -1750,9 +1751,9 @@ } }, "node_modules/@biomejs/cli-win32-x64": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.0.0.tgz", - "integrity": "sha512-2USVQ0hklNsph/KIR72ZdeptyXNnQ3JdzPn3NbjI4Sna34CnxeiYAaZcZzXPDl5PYNFBivV4xmvT3Z3rTmyDBg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.1.2.tgz", + "integrity": "sha512-9zajnk59PMpjBkty3bK2IrjUsUHvqe9HWwyAWQBjGLE7MIBjbX2vwv1XPEhmO2RRuGoTkVx3WCanHrjAytICLA==", "cpu": [ "x64" ], @@ -1929,9 +1930,9 @@ } }, "node_modules/@csstools/postcss-cascade-layers": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.1.tgz", - "integrity": "sha512-XOfhI7GShVcKiKwmPAnWSqd2tBR0uxt+runAxttbSp/LY2U16yAVPmAf7e9q4JJ0d+xMNmpwNDLBXnmRCl3HMQ==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.2.tgz", + "integrity": "sha512-nWBE08nhO8uWl6kSAeCx4im7QfVko3zLrtgWZY4/bP87zrSPpSyN/3W3TDqz1jJuH+kbKOHXg5rJnK+ZVYcFFg==", "dev": true, "funding": [ { @@ -1943,6 +1944,7 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { "@csstools/selector-specificity": "^5.0.0", "postcss-selector-parser": "^7.0.0" @@ -3496,9 +3498,9 @@ "license": "MIT" }, "node_modules/@lingui/babel-plugin-extract-messages": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/@lingui/babel-plugin-extract-messages/-/babel-plugin-extract-messages-5.3.2.tgz", - "integrity": "sha512-uOPHYHyKn37P/YYl4kJo7Fu4yo6IqKsJJtNaOsYoZov9iKSPWTDzU7cVWIrm7s2K+C9vvyLwIfqZukSKC5gNCQ==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@lingui/babel-plugin-extract-messages/-/babel-plugin-extract-messages-5.3.3.tgz", + "integrity": "sha512-Cgac9D9ZrTrNdQPxRc5gmZXVUnofBoSUC7CHSEuua5tPolr20oP4snYEnpOvs2D/sM6AWTbM199i7F2e5m4HYA==", "dev": true, "license": "MIT", "engines": { @@ -3506,18 +3508,18 @@ } }, "node_modules/@lingui/babel-plugin-lingui-macro": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/@lingui/babel-plugin-lingui-macro/-/babel-plugin-lingui-macro-5.3.2.tgz", - "integrity": "sha512-NdXrq8aZlPjN4jeA/LkSLNyx5vPGmrW+r2ywMNQDPQPVP28Hq8c3hF9SQc1t7hwBorGQ3qzIQ7i2Vm6Y8PnjQw==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@lingui/babel-plugin-lingui-macro/-/babel-plugin-lingui-macro-5.3.3.tgz", + "integrity": "sha512-LSdJVBchjHPtFemQJiykDlpSksN9jusKcLbkuhdpgMETNMS5EyFwLTud7YUo5qkOIhtpYIf9mj94t1vGRVeSYQ==", "devOptional": true, "license": "MIT", "dependencies": { "@babel/core": "^7.20.12", "@babel/runtime": "^7.20.13", "@babel/types": "^7.20.7", - "@lingui/conf": "5.3.2", - "@lingui/core": "5.3.2", - "@lingui/message-utils": "5.3.2" + "@lingui/conf": "5.3.3", + "@lingui/core": "5.3.3", + "@lingui/message-utils": "5.3.3" }, "engines": { "node": ">=20.0.0" @@ -3532,9 +3534,9 @@ } }, "node_modules/@lingui/cli": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/@lingui/cli/-/cli-5.3.2.tgz", - "integrity": "sha512-pilromjjdDM2hQ6J5O8p9UlV/HDuFyHnyYGnKbI3BmsCNU0zKw1nf4WIYQZKDLuWNVRGQg93vjNSs9tWAAZQ/w==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@lingui/cli/-/cli-5.3.3.tgz", + "integrity": "sha512-db3aI637XO7z5QeZkrj9pEI3diTuXp0FVHn8TdFgKzQqmKLcv0CgJNftMoQ+DiibifOApyl01ZX81UVXtnQNdA==", "dev": true, "license": "MIT", "dependencies": { @@ -3543,14 +3545,12 @@ "@babel/parser": "^7.22.0", "@babel/runtime": "^7.21.0", "@babel/types": "^7.21.2", - "@lingui/babel-plugin-extract-messages": "5.3.2", - "@lingui/babel-plugin-lingui-macro": "5.3.2", - "@lingui/conf": "5.3.2", - "@lingui/core": "5.3.2", - "@lingui/format-po": "5.3.2", - "@lingui/message-utils": "5.3.2", - "babel-plugin-macros": "^3.0.1", - "chalk": "^4.1.0", + "@lingui/babel-plugin-extract-messages": "5.3.3", + "@lingui/babel-plugin-lingui-macro": "5.3.3", + "@lingui/conf": "5.3.3", + "@lingui/core": "5.3.3", + "@lingui/format-po": "5.3.3", + "@lingui/message-utils": "5.3.3", "chokidar": "3.5.1", "cli-table": "^0.3.11", "commander": "^10.0.0", @@ -3558,12 +3558,10 @@ "date-fns": "^3.6.0", "esbuild": "^0.25.1", "glob": "^11.0.0", - "inquirer": "^7.3.3", "micromatch": "^4.0.7", "normalize-path": "^3.0.0", "ora": "^5.1.0", - "pathe": "^1.1.0", - "pkg-up": "^3.1.0", + "picocolors": "^1.1.1", "pofile": "^1.1.4", "pseudolocale": "^2.0.0", "source-map": "^0.8.0-beta.0" @@ -3644,37 +3642,36 @@ } }, "node_modules/@lingui/conf": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/@lingui/conf/-/conf-5.3.2.tgz", - "integrity": "sha512-c0Dfovr9BLuwAnY5GADxKcwBUQdVl0Jo/JUa3cumIXFhHzZGb78kfhCHjWWQdX8+WQD8qzSl/YkVDbxhcQJGmg==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@lingui/conf/-/conf-5.3.3.tgz", + "integrity": "sha512-YVjGeGQg4BrHrC+/s7kHYYjcBzAPFoGWl/ujdp05J6+PjV7yXnwUaMa3A7XhKFdRqpJReXf9FOWZUsIIBcPSEQ==", "devOptional": true, "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.13", - "chalk": "^4.1.0", "cosmiconfig": "^8.0.0", "jest-validate": "^29.4.3", - "jiti": "^1.17.1" + "jiti": "^1.17.1", + "picocolors": "^1.1.1" }, "engines": { "node": ">=20.0.0" } }, "node_modules/@lingui/core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/@lingui/core/-/core-5.3.2.tgz", - "integrity": "sha512-rLtpZvs5RYlebwjb047PldmiuFBbbVOhEofA90N8pgTCIlfnJRTxfevd6gx3Qp0/uG+AV0DWcZxtba6H/MPYug==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@lingui/core/-/core-5.3.3.tgz", + "integrity": "sha512-H2PAJrbcPBjJg2q3JqMS9OndPkx0kUV+zDLSguONNFGYbe/G7vcNpgEfyYfcCoJBrWaZzJ0iy3Se6LdFbvn6nA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.13", - "@lingui/message-utils": "5.3.2", - "unraw": "^3.0.0" + "@lingui/message-utils": "5.3.3" }, "engines": { "node": ">=20.0.0" }, "peerDependencies": { - "@lingui/babel-plugin-lingui-macro": "5.3.2", + "@lingui/babel-plugin-lingui-macro": "5.3.3", "babel-plugin-macros": "2 || 3" }, "peerDependenciesMeta": { @@ -3687,23 +3684,23 @@ } }, "node_modules/@lingui/detect-locale": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/@lingui/detect-locale/-/detect-locale-5.3.2.tgz", - "integrity": "sha512-UNZcl7k84uHIfOojlP7SKglRsB3I4pUcCDyn2fJvViMjAWWlFSiXWWNPro51GX2uwOGAqad0Uu1yQ8j8pzo5AA==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@lingui/detect-locale/-/detect-locale-5.3.3.tgz", + "integrity": "sha512-a+zeFZpyp375s1Ffo2/si/kNTQa1pmwOfKy15Z8+BT9/2+M/rrrTnmkRizxVWdfl8SvNWo76e+e7skic0bHy9A==", "license": "MIT", "engines": { "node": ">=20.0.0" } }, "node_modules/@lingui/format-po": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/@lingui/format-po/-/format-po-5.3.2.tgz", - "integrity": "sha512-YZxk0CqdTNV6Mwo/PRsx4SHoNxfGEMEK6OHDk42/MGJiUQ6/Od6+2qlAW5z9TvapHnzWbDbU3EdBcqLvgD7Rqw==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@lingui/format-po/-/format-po-5.3.3.tgz", + "integrity": "sha512-sKGJqsIJLPMKwtSP1js7cfFzEXsNSppzYxDPVO06i71Xd0jn8a+KXLMaSAQj9jY/dpxN8wKsCt26gOnHYi5c5g==", "dev": true, "license": "MIT", "dependencies": { - "@lingui/conf": "5.3.2", - "@lingui/message-utils": "5.3.2", + "@lingui/conf": "5.3.3", + "@lingui/message-utils": "5.3.3", "date-fns": "^3.6.0", "pofile": "^1.1.4" }, @@ -3712,19 +3709,19 @@ } }, "node_modules/@lingui/macro": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/@lingui/macro/-/macro-5.3.2.tgz", - "integrity": "sha512-K+G24xhbWFaYVxJRz+I8qXUISfXJ+T9BN+b9RMR+0pwsIshK4TWJNti8WiG8cnPxQmMeQ2waZqCJUPVObGbGvw==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@lingui/macro/-/macro-5.3.3.tgz", + "integrity": "sha512-682DGZWQmK0u9sDgESpSoZjx1uHRroecOq844SOr+24cnunGFG6Z7f4LXjbDphPwKAsjoKPW6tEHnd+eysTP7Q==", "license": "MIT", "dependencies": { - "@lingui/core": "5.3.2", - "@lingui/react": "5.3.2" + "@lingui/core": "5.3.3", + "@lingui/react": "5.3.3" }, "engines": { "node": ">=20.0.0" }, "peerDependencies": { - "@lingui/babel-plugin-lingui-macro": "5.3.2", + "@lingui/babel-plugin-lingui-macro": "5.3.3", "babel-plugin-macros": "2 || 3" }, "peerDependenciesMeta": { @@ -3737,9 +3734,9 @@ } }, "node_modules/@lingui/message-utils": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/@lingui/message-utils/-/message-utils-5.3.2.tgz", - "integrity": "sha512-YUBrXApa3kxcL9oimJdw7oiAJ2ESkI24uyTMaRp9XYNaWgWqpEgoxC5bDN2Fwnk5THFjUp/l64kAD5LJGQhJxQ==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@lingui/message-utils/-/message-utils-5.3.3.tgz", + "integrity": "sha512-Xn1jFX9pworCEKvPwyEo/YJEp8qjELoRkFMUQ+D9AMi8jpaBUbcJpKdJ/TcIt7SKfk8koR/TMxoayMVsh++KCw==", "bundleDependencies": [ "@messageformat/date-skeleton" ], @@ -3753,19 +3750,19 @@ } }, "node_modules/@lingui/react": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/@lingui/react/-/react-5.3.2.tgz", - "integrity": "sha512-wKvgVIKmlz4pIu+mlixjKDLXJoqyG3N3WPB76EScNuDMN0L9T1xMA/bjO9SxgEaUypflALHRsTA2rzViskLFHg==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@lingui/react/-/react-5.3.3.tgz", + "integrity": "sha512-DEFmI24pDdy/wsIDYtmYg5qwAPmgZIjoy9q10GVGmjq952D0sQJoGBGz+ucGQFSNmT7SnktauJHH+xEUdO/Cgg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.13", - "@lingui/core": "5.3.2" + "@lingui/core": "5.3.3" }, "engines": { "node": ">=20.0.0" }, "peerDependencies": { - "@lingui/babel-plugin-lingui-macro": "5.3.2", + "@lingui/babel-plugin-lingui-macro": "5.3.3", "babel-plugin-macros": "2 || 3", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, @@ -3779,20 +3776,20 @@ } }, "node_modules/@lingui/vite-plugin": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/@lingui/vite-plugin/-/vite-plugin-5.3.2.tgz", - "integrity": "sha512-9itYbNBLMEgGSfPmgdvG6gjvYV/Ql2K07gad9m5alVy13GLBGmMSFjlX+1TsI7JIk96neKlxjJwysGGSFbn8bQ==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@lingui/vite-plugin/-/vite-plugin-5.3.3.tgz", + "integrity": "sha512-CHn/8+2SdLxDVYdtUrUQ0DUVhdG0e+U83bqr8OG6JMmlLxLccWGu9JLLloDN34bsGAZqJ1vkEaZ59UHfbtWUaw==", "dev": true, "license": "MIT", "dependencies": { - "@lingui/cli": "5.3.2", - "@lingui/conf": "5.3.2" + "@lingui/cli": "5.3.3", + "@lingui/conf": "5.3.3" }, "engines": { "node": ">=20.0.0" }, "peerDependencies": { - "vite": "^3 || ^4 || ^5.0.9 || ^6" + "vite": "^3 || ^4 || ^5.0.9 || ^6 || ^7" } }, "node_modules/@lukeed/csprng": { @@ -3814,13 +3811,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.53.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.53.0.tgz", - "integrity": "sha512-15hjKreZDcp7t6TL/7jkAo6Df5STZN09jGiv5dbP9A6vMVncXRqE7/B2SncsyOwrkZRBH2i6/TPOL8BVmm3c7w==", + "version": "1.54.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.54.1.tgz", + "integrity": "sha512-FS8hQ12acieG2dYSksmLOF7BNxnVf2afRJdCuM1eMSxj6QTSE6G4InGF7oApGgDb65MX7AwMVlIkpru0yZA4Xw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.53.0" + "playwright": "1.54.1" }, "bin": { "playwright": "cli.js" @@ -3830,10 +3827,11 @@ } }, "node_modules/@preact/preset-vite": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/@preact/preset-vite/-/preset-vite-2.10.1.tgz", - "integrity": "sha512-59lyGBXNfZIr5OOuBUB4/IB8AqF/ULbvYnyItgK/2BJnsGJqaeaJobRVtMp1129obHQuj8oZ/dVxB9inmH8Xig==", + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/@preact/preset-vite/-/preset-vite-2.10.2.tgz", + "integrity": "sha512-K9wHlJOtkE+cGqlyQ5v9kL3Ge0Ql4LlIZjkUTL+1zf3nNdF88F9UZN6VTV8jdzBX9Fl7WSzeNMSDG7qECPmSmg==", "dev": true, + "license": "MIT", "dependencies": { "@babel/plugin-transform-react-jsx": "^7.22.15", "@babel/plugin-transform-react-jsx-development": "^7.22.5", @@ -3841,12 +3839,12 @@ "@rollup/pluginutils": "^4.1.1", "babel-plugin-transform-hook-names": "^1.0.2", "debug": "^4.3.4", - "kolorist": "^1.8.0", + "picocolors": "^1.1.1", "vite-prerender-plugin": "^0.5.3" }, "peerDependencies": { "@babel/core": "7.x", - "vite": "2.x || 3.x || 4.x || 5.x || 6.x" + "vite": "2.x || 3.x || 4.x || 5.x || 6.x || 7.x" } }, "node_modules/@prefresh/babel-plugin": { @@ -4307,9 +4305,9 @@ } }, "node_modules/@types/node": { - "version": "24.0.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.2.tgz", - "integrity": "sha512-Kv1shWMfCUnzbQTosAHrF2p8AzccoLODqJ0XqGPRA/mGVZR86KCk8I+fyh6B5+kcLtAKS9BquXUxVO79jU9UGg==", + "version": "24.0.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.14.tgz", + "integrity": "sha512-4zXMWD91vBLGRtHK3YbIoFMia+1nqEz72coM42C5ETjnNCa/heoj7NT1G67iAfOqMmcfhuCZ4uNpyz8EjlAejw==", "devOptional": true, "license": "MIT", "dependencies": { @@ -4320,7 +4318,8 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", - "devOptional": true + "optional": true, + "peer": true }, "node_modules/@types/resolve": { "version": "1.20.2", @@ -4385,33 +4384,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ansi-regex": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", @@ -4570,7 +4542,8 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "devOptional": true, + "optional": true, + "peer": true, "dependencies": { "@babel/runtime": "^7.12.5", "cosmiconfig": "^7.0.0", @@ -4585,7 +4558,8 @@ "version": "7.1.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "devOptional": true, + "optional": true, + "peer": true, "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -4601,7 +4575,8 @@ "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "devOptional": true, + "optional": true, + "peer": true, "engines": { "node": ">= 6" } @@ -4933,12 +4908,6 @@ "tslib": "^2.0.3" } }, - "node_modules/chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, "node_modules/chokidar": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", @@ -5001,15 +4970,6 @@ "node": ">= 0.2.0" } }, - "node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, "node_modules/clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", @@ -5815,15 +5775,6 @@ "node": ">=6" } }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", @@ -5869,20 +5820,6 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "dependencies": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/fast-blurhash": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/fast-blurhash/-/fast-blurhash-1.1.4.tgz", @@ -5914,21 +5851,6 @@ "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", "dev": true }, - "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/filelist": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", @@ -5974,18 +5896,6 @@ "node": ">=8" } }, - "node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -6383,18 +6293,6 @@ "node": ">=10.17.0" } }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/idb": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", @@ -6459,51 +6357,6 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "node_modules/inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "dev": true, - "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/inquirer/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/internal-slot": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", @@ -7131,19 +6984,6 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "devOptional": true }, - "node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -7230,9 +7070,9 @@ } }, "node_modules/masto": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/masto/-/masto-7.1.0.tgz", - "integrity": "sha512-jIWQr8WIjGOh3bbE4AuS1FIjsMvXbYpUHHQoijQ9Ueb4YqE4fOxWf1eU6ZRHOiBBjTa1Tm20pciRqJTy6IMa7Q==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/masto/-/masto-7.2.0.tgz", + "integrity": "sha512-fjaLIEj0rOn4fzrvOzA/YXgI8kwFX10Z5G8c7hIof6zmbS9aPg5sdrRp54F0gjQZWgBjjWKxVh155zxWnx4Udg==", "license": "MIT", "dependencies": { "change-case": "^4.1.2", @@ -7348,12 +7188,6 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "devOptional": true }, - "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -7579,42 +7413,6 @@ "node": ">=8" } }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/p-retry": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", @@ -7642,15 +7440,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/package-json-from-dist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", @@ -7717,15 +7506,6 @@ "tslib": "^2.0.3" } }, - "node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -7785,12 +7565,6 @@ "node": ">=8" } }, - "node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -7811,26 +7585,14 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dev": true, - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/playwright": { - "version": "1.53.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.53.0.tgz", - "integrity": "sha512-ghGNnIEYZC4E+YtclRn4/p6oYbdPiASELBIYkBXfaTVKreQUYbMUYQDwS12a8F0/HtIjr/CkGjtwABeFPGcS4Q==", + "version": "1.54.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.54.1.tgz", + "integrity": "sha512-peWpSwIBmSLi6aW2auvrUtf2DqY16YYcCMO8rTVx486jKmDTJg7UAhyrraP98GB8BoPURZP8+nxO7TSd4cPr5g==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.53.0" + "playwright-core": "1.54.1" }, "bin": { "playwright": "cli.js" @@ -7843,9 +7605,9 @@ } }, "node_modules/playwright-core": { - "version": "1.53.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.53.0.tgz", - "integrity": "sha512-mGLg8m0pm4+mmtB7M89Xw/GSqoNC+twivl8ITteqvAndachozYe2ZA7srU6uleV1vEdAHYqjq+SV8SNxRRFYBw==", + "version": "1.54.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.54.1.tgz", + "integrity": "sha512-Nbjs2zjj0htNhzgiy5wu+3w09YetDx5pkrpI/kZotDlDUaYk0HVA5xrBVPdow4SAUIlhgKcJeJg4GRKW6xHusA==", "dev": true, "license": "Apache-2.0", "bin": { @@ -7887,9 +7649,9 @@ } }, "node_modules/postcss": { - "version": "8.5.5", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.5.tgz", - "integrity": "sha512-d/jtm+rdNT8tpXuHY5MMtcbJFBkhXE6593XVR9UoGCH8jSFGci7jGvMGH5RYd5PBJW+00NZQt6gf7CbagJCrhg==", + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "dev": true, "funding": [ { @@ -8478,9 +8240,9 @@ } }, "node_modules/postcss-preset-env": { - "version": "10.2.3", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.2.3.tgz", - "integrity": "sha512-zlQN1yYmA7lFeM1wzQI14z97mKoM8qGng+198w1+h6sCud/XxOjcKtApY9jWr7pXNS3yHDEafPlClSsWnkY8ow==", + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.2.4.tgz", + "integrity": "sha512-q+lXgqmTMdB0Ty+EQ31SuodhdfZetUlwCA/F0zRcd/XdxjzI+Rl2JhZNz5US2n/7t9ePsvuhCnEN4Bmu86zXlA==", "dev": true, "funding": [ { @@ -8494,7 +8256,7 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/postcss-cascade-layers": "^5.0.1", + "@csstools/postcss-cascade-layers": "^5.0.2", "@csstools/postcss-color-function": "^4.0.10", "@csstools/postcss-color-mix-function": "^3.0.10", "@csstools/postcss-color-mix-variadic-function-arguments": "^1.0.0", @@ -8647,9 +8409,9 @@ "license": "MIT" }, "node_modules/preact": { - "version": "10.26.8", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.26.8.tgz", - "integrity": "sha512-1nMfdFjucm5hKvq0IClqZwK4FJkGXhRrQstOQ3P4vp8HxKrJEMFcY6RdBRVTdfQS/UlnX6gfbPuTvaqx/bDoeQ==", + "version": "10.26.9", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.26.9.tgz", + "integrity": "sha512-SSjF9vcnF27mJK1XyFMNJzFd5u3pQiATFqoaDy03XuN00u4ziveVVEGt5RKJrDR8MHE/wJo9Nnad56RLzS2RMA==", "license": "MIT", "funding": { "type": "opencollective", @@ -9112,33 +8874,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "dependencies": { - "tslib": "^1.9.0" - }, - "engines": { - "npm": ">=2.0.0" - } - }, - "node_modules/rxjs/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, "node_modules/safe-array-concat": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", @@ -9194,12 +8929,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, "node_modules/scheduler": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", @@ -9342,9 +9071,9 @@ } }, "node_modules/sonda": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/sonda/-/sonda-0.8.0.tgz", - "integrity": "sha512-NzQXa9lLi4gJUlrQ+GKmbhHBv2L/mFfghq2lnYcXDrpWIDrKi1qQkdykjQm5qPMvcvCTtU4dv/MykUEe3io0aQ==", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/sonda/-/sonda-0.9.0.tgz", + "integrity": "sha512-abMPj/ki+FdVCKkC2tFahz3dMFQi5vlSyx5X8u9rUB6IMX7vWwBdv6rMj9XjE7iuWcf/OYn/jVOcXkIUmHzXUA==", "dev": true, "license": "MIT", "dependencies": { @@ -9672,6 +9401,15 @@ "resolved": "https://registry.npmjs.org/swiped-events/-/swiped-events-1.2.0.tgz", "integrity": "sha512-KRu67z1hb4sPxMdFIF2kaufYHTcWOb8NVLbIl2g5dPWZkEQ6D3wfSIVJ7iXbicTt9cO3e0vARqgx9fITtTZxQw==" }, + "node_modules/temml": { + "version": "0.11.9", + "resolved": "https://registry.npmjs.org/temml/-/temml-0.11.9.tgz", + "integrity": "sha512-+k+J6u+OGRroUAE07ynDc6jtmRocEYrRIIJvA182OBoY60nrosSA6hBvLPWdKwgXZNJQeUEdX5maJYICkCLjjw==", + "license": "MIT", + "engines": { + "node": ">=18.13.0" + } + }, "node_modules/temp-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", @@ -9717,12 +9455,6 @@ "node": ">=10" } }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, "node_modules/tinyglobby": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", @@ -9783,18 +9515,6 @@ "yarn": ">= 1.20.0" } }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -10043,12 +9763,6 @@ "node": ">= 10.0.0" } }, - "node_modules/unraw": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unraw/-/unraw-3.0.0.tgz", - "integrity": "sha512-08/DA66UF65OlpUDIQtbJyrqTR0jTAlJ+jsnkQ4jxR7+K5g5YG1APZKQSMCE1vqqmD+2pv6+IdEjmopFatacvg==", - "license": "MIT" - }, "node_modules/upath": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", @@ -10173,24 +9887,24 @@ } }, "node_modules/vite": { - "version": "6.3.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", - "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.5.tgz", + "integrity": "sha512-1mncVwJxy2C9ThLwz0+2GKZyEXuC3MyWtAAlNftlZZXZDP3AJt5FmwcMit/IGGaNZ8ZOB2BNO/HFUB+CpN0NQw==", "dev": true, "license": "MIT", "dependencies": { "esbuild": "^0.25.0", - "fdir": "^6.4.4", + "fdir": "^6.4.6", "picomatch": "^4.0.2", - "postcss": "^8.5.3", - "rollup": "^4.34.9", - "tinyglobby": "^0.2.13" + "postcss": "^8.5.6", + "rollup": "^4.40.0", + "tinyglobby": "^0.2.14" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + "node": "^20.19.0 || >=22.12.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -10199,14 +9913,14 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", - "less": "*", + "less": "^4.0.0", "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" @@ -10273,9 +9987,9 @@ } }, "node_modules/vite-plugin-pwa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-1.0.0.tgz", - "integrity": "sha512-X77jo0AOd5OcxmWj3WnVti8n7Kw2tBgV1c8MCXFclrSlDV23ePzv2eTDIALXI2Qo6nJ5pZJeZAuX0AawvRfoeA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vite-plugin-pwa/-/vite-plugin-pwa-1.0.1.tgz", + "integrity": "sha512-STyUomQbydj7vGamtgQYIJI0YsUZ3T4pJLGBQDQPhzMse6aGSncmEN21OV35PrFsmCvmtiH+Nu1JS1ke4RqBjQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10293,7 +10007,7 @@ }, "peerDependencies": { "@vite-pwa/assets-generator": "^1.0.0", - "vite": "^3.1.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", + "vite": "^3.1.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", "workbox-build": "^7.3.0", "workbox-window": "^7.3.0" }, @@ -10378,9 +10092,9 @@ } }, "node_modules/vite/node_modules/fdir": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", - "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", "dev": true, "license": "MIT", "peerDependencies": { @@ -10405,6 +10119,23 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/vite/node_modules/tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, "node_modules/wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", diff --git a/package.json b/package.json index 0425b54571..730d619a0d 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,11 @@ "messages:extract:clean": "lingui extract --locale en --clean", "messages:compile": "lingui compile", "fetch-i18n-volunteers": "env $(cat .env.local | grep -v \"#\" | xargs) node scripts/fetch-i18n-volunteers.js", - "readme:i18n-volunteers": "node scripts/update-i18n-volunteers-readme.js" + "readme:i18n-volunteers": "node scripts/update-i18n-volunteers-readme.js", + "test": "playwright test", + "test:ui": "playwright test --ui", + "test:headed": "playwright test --headed", + "formatting-check": "npx biome check" }, "dependencies": { "@formatjs/intl-localematcher": "~0.6.1", @@ -22,9 +26,9 @@ "@github/text-expander-element": "~2.9.2", "@iconify-icons/mingcute": "~1.2.9", "@justinribeiro/lite-youtube": "~1.8.2", - "@lingui/detect-locale": "~5.3.2", - "@lingui/macro": "~5.3.2", - "@lingui/react": "~5.3.2", + "@lingui/detect-locale": "~5.3.3", + "@lingui/macro": "~5.3.3", + "@lingui/react": "~5.3.3", "@szhsin/react-menu": "~4.4.1", "chroma-js": "~3.1.2", "compare-versions": "~6.1.1", @@ -37,11 +41,11 @@ "js-cookie": "~3.0.5", "just-debounce-it": "~3.2.0", "lz-string": "~1.5.0", - "masto": "~7.1.0", + "masto": "~7.2.0", "moize": "~6.1.6", "p-retry": "~6.2.1", "p-throttle": "~7.0.0", - "preact": "10.26.8", + "preact": "10.26.9", "punycode": "~2.3.1", "react-hotkeys-hook": "~5.1.0", "react-intersection-observer": "~9.16.0", @@ -49,6 +53,7 @@ "react-router-dom": "6.6.2", "string-length": "6.0.0", "swiped-events": "~1.2.0", + "temml": "~0.11.9", "tinyld": "~1.3.4", "toastify-js": "~1.12.0", "uid": "~2.0.2", @@ -58,22 +63,22 @@ "valtio": "2.1.5" }, "devDependencies": { - "@biomejs/biome": "2.0.0", - "@lingui/babel-plugin-lingui-macro": "~5.3.2", - "@lingui/cli": "~5.3.2", - "@lingui/vite-plugin": "~5.3.2", - "@playwright/test": "~1.53.0", - "@preact/preset-vite": "~2.10.1", - "@types/node": "~24.0.2", - "postcss": "~8.5.5", + "@biomejs/biome": "2.1.2", + "@lingui/babel-plugin-lingui-macro": "~5.3.3", + "@lingui/cli": "~5.3.3", + "@lingui/vite-plugin": "~5.3.3", + "@playwright/test": "~1.54.1", + "@preact/preset-vite": "~2.10.2", + "@types/node": "~24.0.14", + "postcss": "~8.5.6", "postcss-dark-theme-class": "~1.3.0", - "postcss-preset-env": "~10.2.3", - "sonda": "~0.8.0", + "postcss-preset-env": "~10.2.4", + "sonda": "~0.9.0", "twitter-text": "~3.1.0", - "vite": "~6.3.5", + "vite": "~7.0.5", "vite-plugin-generate-file": "~0.3.1", "vite-plugin-html-config": "~2.0.2", - "vite-plugin-pwa": "~1.0.0", + "vite-plugin-pwa": "~1.0.1", "vite-plugin-remove-console": "~2.2.0", "vite-plugin-run": "~0.6.1", "workbox-cacheable-response": "~7.3.0", diff --git a/src/app.css b/src/app.css index c7b085d410..0fd601f745 100644 --- a/src/app.css +++ b/src/app.css @@ -448,7 +448,8 @@ a[href^='http'][rel*='nofollow']:visited:not(:has(div)) { var(--line-radius), var(--line-radius); */ --curves-radius: calc(var(--curves-width) / 2); height: calc(var(--curves-width) - var(--line-width)); - background-image: radial-gradient( + background-image: + radial-gradient( circle at bottom var(--forward), transparent calc(var(--curves-radius) - var(--line-width)), var(--comment-line-color) calc(var(--curves-radius) - var(--line-width)) @@ -479,7 +480,8 @@ a[href^='http'][rel*='nofollow']:visited:not(:has(div)) { transparent ); &.hero:not(:has(+ .thread), :first-child, :only-child, :last-child) { - background-image: linear-gradient( + background-image: + linear-gradient( var(--line-dir), transparent, transparent var(--indent-small-start), @@ -1083,7 +1085,8 @@ a[href^='http'][rel*='nofollow']:visited:not(:has(div)) { position: absolute; inset: 0; pointer-events: none; - background-image: radial-gradient( + background-image: + radial-gradient( ellipse 50% 32px at bottom center, var(--carousel-faded-color), transparent @@ -2358,7 +2361,8 @@ body > .szh-menu-container { var(--bg-color) var(--middle-circle-radius), transparent var(--middle-circle-radius) ); - background-image: var(--middle-circle), + background-image: + var(--middle-circle), conic-gradient(var(--color) var(--fill), var(--outline-color) 0); transform: scale(0.7); &:dir(rtl) { diff --git a/src/components/ICONS.jsx b/src/components/ICONS.jsx index d0295475cd..b77c7adf8b 100644 --- a/src/components/ICONS.jsx +++ b/src/components/ICONS.jsx @@ -183,4 +183,5 @@ export const ICONS = { module: () => import('@iconify-icons/mingcute/user-star-line'), rtl: true, }, + formula: () => import('@iconify-icons/mingcute/formula-line'), }; diff --git a/src/components/account-info.css b/src/components/account-info.css index 72ada8b9da..c5fa5069ab 100644 --- a/src/components/account-info.css +++ b/src/components/account-info.css @@ -845,11 +845,9 @@ overflow: hidden; border: 1px solid var(--outline-color); /* checkerboard background */ - background-image: linear-gradient( - 45deg, - var(--img-bg-color) 25%, - transparent 25% - ), linear-gradient(-45deg, var(--img-bg-color) 25%, transparent 25%), + background-image: + linear-gradient(45deg, var(--img-bg-color) 25%, transparent 25%), + linear-gradient(-45deg, var(--img-bg-color) 25%, transparent 25%), linear-gradient(45deg, transparent 75%, var(--img-bg-color) 75%), linear-gradient(-45deg, transparent 75%, var(--img-bg-color) 75%); background-size: 10px 10px; diff --git a/src/components/compose.css b/src/components/compose.css index 9c6ca2212d..93de66f23b 100644 --- a/src/components/compose.css +++ b/src/components/compose.css @@ -417,11 +417,9 @@ width: 80px; height: 80px; /* checkerboard background */ - background-image: linear-gradient( - 45deg, - var(--img-bg-color) 25%, - transparent 25% - ), linear-gradient(-45deg, var(--img-bg-color) 25%, transparent 25%), + background-image: + linear-gradient(45deg, var(--img-bg-color) 25%, transparent 25%), + linear-gradient(-45deg, var(--img-bg-color) 25%, transparent 25%), linear-gradient(45deg, transparent 75%, var(--img-bg-color) 75%), linear-gradient(-45deg, transparent 75%, var(--img-bg-color) 75%); background-size: 10px 10px; @@ -687,11 +685,9 @@ overflow: hidden; box-shadow: 0 2px 16px var(--img-bg-color); /* checkerboard background */ - background-image: linear-gradient( - 45deg, - var(--img-bg-color) 25%, - transparent 25% - ), linear-gradient(-45deg, var(--img-bg-color) 25%, transparent 25%), + background-image: + linear-gradient(45deg, var(--img-bg-color) 25%, transparent 25%), + linear-gradient(-45deg, var(--img-bg-color) 25%, transparent 25%), linear-gradient(45deg, transparent 75%, var(--img-bg-color) 75%), linear-gradient(-45deg, transparent 75%, var(--img-bg-color) 75%); background-size: 20px 20px; diff --git a/src/components/compose.jsx b/src/components/compose.jsx index 15636315c8..e98eca1563 100644 --- a/src/components/compose.jsx +++ b/src/components/compose.jsx @@ -2324,7 +2324,11 @@ const Textarea = forwardRef((props, ref) => { // Get line before cursor position after pressing 'Enter' const { key, target } = e; const hasTextExpander = hasTextExpanderRef.current; - if (key === 'Enter' && !(e.ctrlKey || e.metaKey || hasTextExpander)) { + if ( + key === 'Enter' && + !(e.ctrlKey || e.metaKey || hasTextExpander) && + !e.isComposing + ) { try { const { value, selectionStart } = target; const textBeforeCursor = value.slice(0, selectionStart); diff --git a/src/components/media.jsx b/src/components/media.jsx index d43643af1d..bada873178 100644 --- a/src/components/media.jsx +++ b/src/components/media.jsx @@ -289,11 +289,21 @@ function Media({ onClick(e); } else { e.preventDefault(); - el.style.viewTransitionName = mediaVTN; - document.startViewTransition(() => { - el.style.viewTransitionName = ''; + if (el.dataset.viewTransitioned) { + el.style.viewTransitionName = mediaVTN; + try { + document.startViewTransition(() => { + el.style.viewTransitionName = ''; + location.hash = `#${to}`; + }); + } catch (e) { + console.error(e); + el.style.viewTransitionName = ''; + location.hash = `#${to}`; + } + } else { location.hash = `#${to}`; - }); + } } } else { onClick?.(e); diff --git a/src/components/nav-menu.css b/src/components/nav-menu.css index db5f5e1afc..4e9f673660 100644 --- a/src/components/nav-menu.css +++ b/src/components/nav-menu.css @@ -51,7 +51,8 @@ } } .nav-menu section:last-child { - background-image: linear-gradient( + background-image: + linear-gradient( var(--to-forward), var(--divider-color) 1px, transparent 1px diff --git a/src/components/report-modal.jsx b/src/components/report-modal.jsx index 5a8ad1f44b..0d452078e8 100644 --- a/src/components/report-modal.jsx +++ b/src/components/report-modal.jsx @@ -6,6 +6,7 @@ import { Fragment } from 'preact'; import { useMemo, useRef, useState } from 'preact/hooks'; import { api } from '../utils/api'; +import localeMatch from '../utils/locale-match'; import showToast from '../utils/show-toast'; import { getCurrentInstance } from '../utils/store-utils'; @@ -17,7 +18,7 @@ import Status from './status'; // NOTE: `dislike` hidden for now, it's actually not used for reporting // Mastodon shows another screen for unfollowing, muting or blocking instead of reporting -const CATEGORIES = [/*'dislike'*/ , 'spam', 'legal', 'violation', 'other']; +const CATEGORIES = [/*'dislike' ,*/ 'spam', 'legal', 'violation', 'other']; // `violation` will be set if there are `rule_ids[]` const CATEGORIES_INFO = { @@ -45,16 +46,58 @@ const CATEGORIES_INFO = { }, }; +function findMatchingLanguage(rule, currentLang) { + if (!rule.translations || !currentLang) return null; + const availableLanguages = Object.keys(rule.translations); + if (!availableLanguages?.length) return null; + + let matchedLang = localeMatch([currentLang], availableLanguages, null); + if (!matchedLang) { + // localeMatch fails if there are keys like zhCn, zhTw + // Convert them something like zh-CN first, try again + // Detect uppercase, then split by dash + const normalizedLanguages = availableLanguages.map((lang) => { + const parts = lang.split(/(?=[A-Z])/); + return parts + .map((part, i) => (i === 0 ? part : part.toLowerCase())) + .join('-'); + }); + matchedLang = localeMatch([currentLang], normalizedLanguages, null); + } + + // If matchedLang has dash, convert back to original format + // E.g. zh-cn to zhCn + if (matchedLang && matchedLang.includes('-')) { + const [lang, region] = matchedLang.split('-'); + matchedLang = lang + region.charAt(0).toUpperCase() + region.slice(1); + } + + return matchedLang; +} + +function translateRules(rules, currentLang) { + if (!rules?.length) return []; + if (!currentLang) return rules; + return rules.map((rule) => { + const matchedLang = findMatchingLanguage(rule, currentLang); + return { + ...rule, + _translatedText: rule.translations?.[matchedLang]?.text || null, + }; + }); +} + function ReportModal({ account, post, onClose }) { - const { _, t } = useLingui(); + const { _, t, i18n } = useLingui(); const { masto } = api(); const [uiState, setUIState] = useState('default'); const [username, domain] = account.acct.split('@'); - const [rules, currentDomain] = useMemo(() => { + const [translatedRules, currentDomain] = useMemo(() => { const { rules, domain } = getCurrentInstance(); - return [rules || [], domain]; - }); + const rawRules = rules || []; + return [translateRules(rawRules, i18n.locale), domain]; + }, [i18n.locale]); const [selectedCategory, setSelectedCategory] = useState(null); const [showRules, setShowRules] = useState(false); @@ -165,7 +208,7 @@ function ReportModal({ account, post, onClose }) {

{CATEGORIES.map((category) => - category === 'violation' && !rules?.length ? null : ( + category === 'violation' && !translatedRules?.length ? null : ( - {category === 'violation' && !!rules?.length && ( + {category === 'violation' && !!translatedRules?.length && (