this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Migrate from prettier to biome

+439 -344
+16
.github/workflows/format-check.yml
··· 1 + name: Code formatting check on pull requests 2 + 3 + on: 4 + pull_request: 5 + workflow_dispatch: 6 + 7 + jobs: 8 + format-check: 9 + runs-on: ubuntu-latest 10 + steps: 11 + - uses: actions/checkout@v4 12 + - uses: actions/setup-node@v4 13 + with: 14 + node-version: 20 15 + - run: npm ci 16 + - run: npx biome check
-19
.github/workflows/prettier-pr.yml
··· 1 - name: Prettier on pull requests 2 - 3 - on: 4 - pull_request: 5 - workflow_dispatch: 6 - 7 - jobs: 8 - prettier: 9 - runs-on: ubuntu-latest 10 - steps: 11 - - uses: actions/checkout@v4 12 - # Need node to install prettier plugin(s) 13 - - uses: actions/setup-node@v4 14 - with: 15 - node-version: 20 16 - - run: npm ci 17 - - run: | 18 - echo "Prettier-ing files" 19 - npx prettier "src/**/*.{js,jsx}" --check
-22
.prettierrc
··· 1 - { 2 - "tabWidth": 2, 3 - "useTabs": false, 4 - "singleQuote": true, 5 - "trailingComma": "all", 6 - "plugins": ["@ianvs/prettier-plugin-sort-imports"], 7 - "importOrder": [ 8 - "^[^.].*.css$", 9 - "index.css$", 10 - ".css$", 11 - "", 12 - "./polyfills", 13 - "", 14 - "<THIRD_PARTY_MODULES>", 15 - "", 16 - "/assets/", 17 - "", 18 - "^../", 19 - "", 20 - "^[./]" 21 - ] 22 - }
+59
biome.json
··· 1 + { 2 + "$schema": "https://biomejs.dev/schemas/2.0.0/schema.json", 3 + "vcs": { 4 + "enabled": true, 5 + "clientKind": "git", 6 + "useIgnoreFile": true 7 + }, 8 + "files": { 9 + "includes": [ 10 + "src/**/*.{js,jsx,ts,tsx,css}", 11 + "*.{js,jsx,ts,tsx,json,jsonc}", 12 + "scripts/**/*.js", 13 + "!wrangler.jsonc", 14 + "!i18n-volunteers.json" 15 + ] 16 + }, 17 + "formatter": { 18 + "indentStyle": "space" 19 + }, 20 + "linter": { 21 + "enabled": false 22 + }, 23 + "javascript": { 24 + "formatter": { 25 + "quoteStyle": "single" 26 + } 27 + }, 28 + "css": { 29 + "formatter": { 30 + "quoteStyle": "single" 31 + } 32 + }, 33 + "assist": { 34 + "actions": { 35 + "source": { 36 + "organizeImports": { 37 + "level": "on", 38 + "options": { 39 + "groups": [ 40 + "**/*.css", 41 + ":BLANK_LINE:", 42 + "./polyfills", 43 + ":BLANK_LINE:", 44 + [":NODE:", ":BUN:"], 45 + ":BLANK_LINE:", 46 + [":PACKAGE:", ":PACKAGE_WITH_PROTOCOL:"], 47 + ":BLANK_LINE:", 48 + "**/assets/**", 49 + ":BLANK_LINE:", 50 + "../**", 51 + ":BLANK_LINE:", 52 + ["./**", "./"] 53 + ] 54 + } 55 + } 56 + } 57 + } 58 + } 59 + }
+164 -140
package-lock.json
··· 50 50 "valtio": "2.1.5" 51 51 }, 52 52 "devDependencies": { 53 - "@ianvs/prettier-plugin-sort-imports": "~4.4.2", 53 + "@biomejs/biome": "2.0.0", 54 54 "@lingui/babel-plugin-lingui-macro": "~5.3.2", 55 55 "@lingui/cli": "~5.3.2", 56 56 "@lingui/vite-plugin": "~5.3.2", ··· 60 60 "postcss": "~8.5.5", 61 61 "postcss-dark-theme-class": "~1.3.0", 62 62 "postcss-preset-env": "~10.2.3", 63 - "prettier": "3.5.3", 64 63 "sonda": "~0.8.0", 65 64 "twitter-text": "~3.1.0", 66 65 "vite": "~6.3.5", ··· 1604 1603 "node": ">=6.9.0" 1605 1604 } 1606 1605 }, 1606 + "node_modules/@biomejs/biome": { 1607 + "version": "2.0.0", 1608 + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-2.0.0.tgz", 1609 + "integrity": "sha512-BlUoXEOI/UQTDEj/pVfnkMo8SrZw3oOWBDrXYFT43V7HTkIUDkBRY53IC5Jx1QkZbaB+0ai1wJIfYwp9+qaJTQ==", 1610 + "dev": true, 1611 + "license": "MIT OR Apache-2.0", 1612 + "bin": { 1613 + "biome": "bin/biome" 1614 + }, 1615 + "engines": { 1616 + "node": ">=14.21.3" 1617 + }, 1618 + "funding": { 1619 + "type": "opencollective", 1620 + "url": "https://opencollective.com/biome" 1621 + }, 1622 + "optionalDependencies": { 1623 + "@biomejs/cli-darwin-arm64": "2.0.0", 1624 + "@biomejs/cli-darwin-x64": "2.0.0", 1625 + "@biomejs/cli-linux-arm64": "2.0.0", 1626 + "@biomejs/cli-linux-arm64-musl": "2.0.0", 1627 + "@biomejs/cli-linux-x64": "2.0.0", 1628 + "@biomejs/cli-linux-x64-musl": "2.0.0", 1629 + "@biomejs/cli-win32-arm64": "2.0.0", 1630 + "@biomejs/cli-win32-x64": "2.0.0" 1631 + } 1632 + }, 1633 + "node_modules/@biomejs/cli-darwin-arm64": { 1634 + "version": "2.0.0", 1635 + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-2.0.0.tgz", 1636 + "integrity": "sha512-QvqWYtFFhhxdf8jMAdJzXW+Frc7X8XsnHQLY+TBM1fnT1TfeV/v9vsFI5L2J7GH6qN1+QEEJ19jHibCY2Ypplw==", 1637 + "cpu": [ 1638 + "arm64" 1639 + ], 1640 + "dev": true, 1641 + "license": "MIT OR Apache-2.0", 1642 + "optional": true, 1643 + "os": [ 1644 + "darwin" 1645 + ], 1646 + "engines": { 1647 + "node": ">=14.21.3" 1648 + } 1649 + }, 1650 + "node_modules/@biomejs/cli-darwin-x64": { 1651 + "version": "2.0.0", 1652 + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-2.0.0.tgz", 1653 + "integrity": "sha512-5JFhls1EfmuIH4QGFPlNpxJQFC6ic3X1ltcoLN+eSRRIPr6H/lUS1ttuD0Fj7rPgPhZqopK/jfH8UVj/1hIsQw==", 1654 + "cpu": [ 1655 + "x64" 1656 + ], 1657 + "dev": true, 1658 + "license": "MIT OR Apache-2.0", 1659 + "optional": true, 1660 + "os": [ 1661 + "darwin" 1662 + ], 1663 + "engines": { 1664 + "node": ">=14.21.3" 1665 + } 1666 + }, 1667 + "node_modules/@biomejs/cli-linux-arm64": { 1668 + "version": "2.0.0", 1669 + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-2.0.0.tgz", 1670 + "integrity": "sha512-BAH4QVi06TzAbVchXdJPsL0Z/P87jOfes15rI+p3EX9/EGTfIjaQ9lBVlHunxcmoptaA5y1Hdb9UYojIhmnjIw==", 1671 + "cpu": [ 1672 + "arm64" 1673 + ], 1674 + "dev": true, 1675 + "license": "MIT OR Apache-2.0", 1676 + "optional": true, 1677 + "os": [ 1678 + "linux" 1679 + ], 1680 + "engines": { 1681 + "node": ">=14.21.3" 1682 + } 1683 + }, 1684 + "node_modules/@biomejs/cli-linux-arm64-musl": { 1685 + "version": "2.0.0", 1686 + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.0.0.tgz", 1687 + "integrity": "sha512-Bxsz8ki8+b3PytMnS5SgrGV+mbAWwIxI3ydChb/d1rURlJTMdxTTq5LTebUnlsUWAX6OvJuFeiVq9Gjn1YbCyA==", 1688 + "cpu": [ 1689 + "arm64" 1690 + ], 1691 + "dev": true, 1692 + "license": "MIT OR Apache-2.0", 1693 + "optional": true, 1694 + "os": [ 1695 + "linux" 1696 + ], 1697 + "engines": { 1698 + "node": ">=14.21.3" 1699 + } 1700 + }, 1701 + "node_modules/@biomejs/cli-linux-x64": { 1702 + "version": "2.0.0", 1703 + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-2.0.0.tgz", 1704 + "integrity": "sha512-09PcOGYTtkopWRm6mZ/B6Mr6UHdkniUgIG/jLBv+2J8Z61ezRE+xQmpi3yNgUrFIAU4lPA9atg7mhvE/5Bo7Wg==", 1705 + "cpu": [ 1706 + "x64" 1707 + ], 1708 + "dev": true, 1709 + "license": "MIT OR Apache-2.0", 1710 + "optional": true, 1711 + "os": [ 1712 + "linux" 1713 + ], 1714 + "engines": { 1715 + "node": ">=14.21.3" 1716 + } 1717 + }, 1718 + "node_modules/@biomejs/cli-linux-x64-musl": { 1719 + "version": "2.0.0", 1720 + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-2.0.0.tgz", 1721 + "integrity": "sha512-tiQ0ABxMJb9I6GlfNp0ulrTiQSFacJRJO8245FFwE3ty3bfsfxlU/miblzDIi+qNrgGsLq5wIZcVYGp4c+HXZA==", 1722 + "cpu": [ 1723 + "x64" 1724 + ], 1725 + "dev": true, 1726 + "license": "MIT OR Apache-2.0", 1727 + "optional": true, 1728 + "os": [ 1729 + "linux" 1730 + ], 1731 + "engines": { 1732 + "node": ">=14.21.3" 1733 + } 1734 + }, 1735 + "node_modules/@biomejs/cli-win32-arm64": { 1736 + "version": "2.0.0", 1737 + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-2.0.0.tgz", 1738 + "integrity": "sha512-vrTtuGu91xNTEQ5ZcMJBZuDlqr32DWU1r14UfePIGndF//s2WUAmer4FmgoPgruo76rprk37e8S2A2c0psXdxw==", 1739 + "cpu": [ 1740 + "arm64" 1741 + ], 1742 + "dev": true, 1743 + "license": "MIT OR Apache-2.0", 1744 + "optional": true, 1745 + "os": [ 1746 + "win32" 1747 + ], 1748 + "engines": { 1749 + "node": ">=14.21.3" 1750 + } 1751 + }, 1752 + "node_modules/@biomejs/cli-win32-x64": { 1753 + "version": "2.0.0", 1754 + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-2.0.0.tgz", 1755 + "integrity": "sha512-2USVQ0hklNsph/KIR72ZdeptyXNnQ3JdzPn3NbjI4Sna34CnxeiYAaZcZzXPDl5PYNFBivV4xmvT3Z3rTmyDBg==", 1756 + "cpu": [ 1757 + "x64" 1758 + ], 1759 + "dev": true, 1760 + "license": "MIT OR Apache-2.0", 1761 + "optional": true, 1762 + "os": [ 1763 + "win32" 1764 + ], 1765 + "engines": { 1766 + "node": ">=14.21.3" 1767 + } 1768 + }, 1607 1769 "node_modules/@csstools/cascade-layer-name-parser": { 1608 1770 "version": "2.0.5", 1609 1771 "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.5.tgz", ··· 3176 3338 "dom-input-range": "^2.0.0" 3177 3339 } 3178 3340 }, 3179 - "node_modules/@ianvs/prettier-plugin-sort-imports": { 3180 - "version": "4.4.2", 3181 - "resolved": "https://registry.npmjs.org/@ianvs/prettier-plugin-sort-imports/-/prettier-plugin-sort-imports-4.4.2.tgz", 3182 - "integrity": "sha512-KkVFy3TLh0OFzimbZglMmORi+vL/i2OFhEs5M07R9w0IwWAGpsNNyE4CY/2u0YoMF5bawKC2+8/fUH60nnNtjw==", 3183 - "dev": true, 3184 - "license": "Apache-2.0", 3185 - "dependencies": { 3186 - "@babel/generator": "^7.26.2", 3187 - "@babel/parser": "^7.26.2", 3188 - "@babel/traverse": "^7.25.9", 3189 - "@babel/types": "^7.26.0", 3190 - "semver": "^7.5.2" 3191 - }, 3192 - "peerDependencies": { 3193 - "@vue/compiler-sfc": "2.7.x || 3.x", 3194 - "prettier": "2 || 3 || ^4.0.0-0" 3195 - }, 3196 - "peerDependenciesMeta": { 3197 - "@vue/compiler-sfc": { 3198 - "optional": true 3199 - } 3200 - } 3201 - }, 3202 - "node_modules/@ianvs/prettier-plugin-sort-imports/node_modules/semver": { 3203 - "version": "7.6.2", 3204 - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", 3205 - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", 3206 - "dev": true, 3207 - "bin": { 3208 - "semver": "bin/semver.js" 3209 - }, 3210 - "engines": { 3211 - "node": ">=10" 3212 - } 3213 - }, 3214 3341 "node_modules/@iconify-icons/mingcute": { 3215 3342 "version": "1.2.9", 3216 3343 "resolved": "https://registry.npmjs.org/@iconify-icons/mingcute/-/mingcute-1.2.9.tgz", ··· 4229 4356 "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", 4230 4357 "devOptional": true, 4231 4358 "license": "MIT" 4232 - }, 4233 - "node_modules/@vue/compiler-core": { 4234 - "version": "3.2.45", 4235 - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.45.tgz", 4236 - "integrity": "sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==", 4237 - "dev": true, 4238 - "license": "MIT", 4239 - "optional": true, 4240 - "peer": true, 4241 - "dependencies": { 4242 - "@babel/parser": "^7.16.4", 4243 - "@vue/shared": "3.2.45", 4244 - "estree-walker": "^2.0.2", 4245 - "source-map": "^0.6.1" 4246 - } 4247 - }, 4248 - "node_modules/@vue/compiler-dom": { 4249 - "version": "3.2.45", 4250 - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz", 4251 - "integrity": "sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==", 4252 - "dev": true, 4253 - "license": "MIT", 4254 - "optional": true, 4255 - "peer": true, 4256 - "dependencies": { 4257 - "@vue/compiler-core": "3.2.45", 4258 - "@vue/shared": "3.2.45" 4259 - } 4260 - }, 4261 - "node_modules/@vue/compiler-sfc": { 4262 - "version": "3.2.45", 4263 - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.45.tgz", 4264 - "integrity": "sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q==", 4265 - "dev": true, 4266 - "license": "MIT", 4267 - "optional": true, 4268 - "peer": true, 4269 - "dependencies": { 4270 - "@babel/parser": "^7.16.4", 4271 - "@vue/compiler-core": "3.2.45", 4272 - "@vue/compiler-dom": "3.2.45", 4273 - "@vue/compiler-ssr": "3.2.45", 4274 - "@vue/reactivity-transform": "3.2.45", 4275 - "@vue/shared": "3.2.45", 4276 - "estree-walker": "^2.0.2", 4277 - "magic-string": "^0.25.7", 4278 - "postcss": "^8.1.10", 4279 - "source-map": "^0.6.1" 4280 - } 4281 - }, 4282 - "node_modules/@vue/compiler-ssr": { 4283 - "version": "3.2.45", 4284 - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.45.tgz", 4285 - "integrity": "sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==", 4286 - "dev": true, 4287 - "license": "MIT", 4288 - "optional": true, 4289 - "peer": true, 4290 - "dependencies": { 4291 - "@vue/compiler-dom": "3.2.45", 4292 - "@vue/shared": "3.2.45" 4293 - } 4294 - }, 4295 - "node_modules/@vue/reactivity-transform": { 4296 - "version": "3.2.45", 4297 - "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.45.tgz", 4298 - "integrity": "sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==", 4299 - "dev": true, 4300 - "license": "MIT", 4301 - "optional": true, 4302 - "peer": true, 4303 - "dependencies": { 4304 - "@babel/parser": "^7.16.4", 4305 - "@vue/compiler-core": "3.2.45", 4306 - "@vue/shared": "3.2.45", 4307 - "estree-walker": "^2.0.2", 4308 - "magic-string": "^0.25.7" 4309 - } 4310 - }, 4311 - "node_modules/@vue/shared": { 4312 - "version": "3.2.45", 4313 - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.45.tgz", 4314 - "integrity": "sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==", 4315 - "dev": true, 4316 - "license": "MIT", 4317 - "optional": true, 4318 - "peer": true 4319 4359 }, 4320 4360 "node_modules/acorn": { 4321 4361 "version": "8.12.1", ··· 8614 8654 "funding": { 8615 8655 "type": "opencollective", 8616 8656 "url": "https://opencollective.com/preact" 8617 - } 8618 - }, 8619 - "node_modules/prettier": { 8620 - "version": "3.5.3", 8621 - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", 8622 - "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", 8623 - "dev": true, 8624 - "license": "MIT", 8625 - "bin": { 8626 - "prettier": "bin/prettier.cjs" 8627 - }, 8628 - "engines": { 8629 - "node": ">=14" 8630 - }, 8631 - "funding": { 8632 - "url": "https://github.com/prettier/prettier?sponsor=1" 8633 8657 } 8634 8658 }, 8635 8659 "node_modules/pretty-bytes": {
+1 -2
package.json
··· 58 58 "valtio": "2.1.5" 59 59 }, 60 60 "devDependencies": { 61 - "@ianvs/prettier-plugin-sort-imports": "~4.4.2", 61 + "@biomejs/biome": "2.0.0", 62 62 "@lingui/babel-plugin-lingui-macro": "~5.3.2", 63 63 "@lingui/cli": "~5.3.2", 64 64 "@lingui/vite-plugin": "~5.3.2", ··· 68 68 "postcss": "~8.5.5", 69 69 "postcss-dark-theme-class": "~1.3.0", 70 70 "postcss-preset-env": "~10.2.3", 71 - "prettier": "3.5.3", 72 71 "sonda": "~0.8.0", 73 72 "twitter-text": "~3.1.0", 74 73 "vite": "~6.3.5",
-2
rollbar.js
··· 330 330 for ( 331 331 var a = e.removeEventListener; 332 332 a._rollbarOldRemove && a.belongsToShim; 333 - 334 333 ) 335 334 a = a._rollbarOldRemove; 336 335 var l = function (r, e, o) { ··· 407 406 }, 408 407 i = 0; 409 408 (o = window._rollbarShims[i++]); 410 - 411 409 ) 412 410 n || (n = o.handler), 413 411 o.handler._swapAndProcessMessages(l, o.messages);
+1
scripts/extract-url.js
··· 1 1 import fs from 'fs'; 2 + 2 3 import regexSupplant from 'twitter-text/dist/lib/regexSupplant.js'; 3 4 import validDomain from 'twitter-text/dist/regexp/validDomain.js'; 4 5 import validPortNumber from 'twitter-text/dist/regexp/validPortNumber.js';
+44 -30
src/app.css
··· 448 448 var(--line-radius), var(--line-radius); */ 449 449 --curves-radius: calc(var(--curves-width) / 2); 450 450 height: calc(var(--curves-width) - var(--line-width)); 451 - background-image: 452 - radial-gradient( 451 + background-image: radial-gradient( 453 452 circle at bottom var(--forward), 454 453 transparent calc(var(--curves-radius) - var(--line-width)), 455 454 var(--comment-line-color) calc(var(--curves-radius) - var(--line-width)) ··· 480 479 transparent 481 480 ); 482 481 &.hero:not(:has(+ .thread), :first-child, :only-child, :last-child) { 483 - background-image: 484 - linear-gradient( 482 + background-image: linear-gradient( 485 483 var(--line-dir), 486 484 transparent, 487 485 transparent var(--indent-small-start), ··· 557 555 + .replies 558 556 .replies-summary { 559 557 margin-inline-start: calc( 560 - var(--avatar-size) + var(--avatar-margin-start) + var(--avatar-margin-end) + 561 - (var(--line-margin-end) * (var(--comments-level) - 1)) 558 + var(--avatar-size) + 559 + var(--avatar-margin-start) + 560 + var(--avatar-margin-end) + 561 + (var(--line-margin-end) * (var(--comments-level) - 1)) 562 562 ); 563 563 } 564 564 .timeline.contextual ··· 567 567 + .replies 568 568 :is(.status-link, .status-focus) { 569 569 padding-inline-start: calc( 570 - var(--avatar-size) + var(--avatar-margin-start) + var(--avatar-margin-end) + 571 - (var(--line-margin-end) * (var(--comments-level) - 1)) 570 + var(--avatar-size) + 571 + var(--avatar-margin-start) + 572 + var(--avatar-margin-end) + 573 + (var(--line-margin-end) * (var(--comments-level) - 1)) 572 574 ); 573 575 } 574 576 .timeline.contextual ··· 577 579 + .replies 578 580 .replies-summary { 579 581 margin-inline-start: calc( 580 - var(--thread-start) + var(--line-margin-end) * var(--comments-level) 582 + var(--thread-start) + 583 + var(--line-margin-end) * 584 + var(--comments-level) 581 585 ); 582 586 } 583 587 .timeline.contextual ··· 586 590 + .replies 587 591 :is(.status-link, .status-focus) { 588 592 padding-inline-start: calc( 589 - var(--thread-start) + var(--line-margin-end) * var(--comments-level) 593 + var(--thread-start) + 594 + var(--line-margin-end) * 595 + var(--comments-level) 590 596 ); 591 597 } 592 598 .timeline.contextual > li.descendant:not(.thread):before { ··· 611 617 } 612 618 .timeline.contextual > li.ancestor .replies-link { 613 619 margin-inline-start: calc( 614 - var(--avatar-size) + var(--avatar-margin-start) + var(--avatar-margin-end) 620 + var(--avatar-size) + 621 + var(--avatar-margin-start) + 622 + var(--avatar-margin-end) 615 623 ); 616 624 } 617 625 .timeline.contextual ··· 619 627 > :is(.status-link, .status-focus) 620 628 .replies-link { 621 629 margin-inline-start: calc( 622 - var(--avatar-size) + var(--avatar-margin-start) + var(--avatar-margin-end) 630 + var(--avatar-size) + 631 + var(--avatar-margin-start) + 632 + var(--avatar-margin-end) 623 633 ); 624 634 } 625 635 .timeline.contextual > li .replies-link * { ··· 774 784 } 775 785 .timeline.contextual > li .replies li:not(.content li) { 776 786 --line-start: calc( 777 - var(--thread-start) + var(--line-margin-end) * var(--comments-level) 787 + var(--thread-start) + 788 + var(--line-margin-end) * 789 + var(--comments-level) 778 790 ); 779 791 --line-end: calc(var(--line-start) + var(--line-width)); 780 792 background-image: linear-gradient( ··· 796 808 } */ 797 809 .timeline.contextual > li.thread .replies li:not(.content li) { 798 810 --line-start: calc( 799 - var(--avatar-size) + var(--avatar-margin-start) + var(--avatar-margin-end) + 800 - (var(--line-margin-end) * (var(--comments-level) - 1)) 811 + var(--avatar-size) + 812 + var(--avatar-margin-start) + 813 + var(--avatar-margin-end) + 814 + (var(--line-margin-end) * (var(--comments-level) - 1)) 801 815 ); 802 816 } 803 817 /* .timeline.contextual > li.thread .replies .replies li { ··· 840 854 } */ 841 855 .timeline.contextual > li.thread .replies li:not(.content li):before { 842 856 --line-start: calc( 843 - var(--avatar-size) + var(--avatar-margin-start) + var(--avatar-margin-end) + 844 - (var(--line-margin-end) * (var(--comments-level) - 1)) 857 + var(--avatar-size) + 858 + var(--avatar-margin-start) + 859 + var(--avatar-margin-end) + 860 + (var(--line-margin-end) * (var(--comments-level) - 1)) 845 861 ); 846 862 } 847 863 /* .timeline.contextual > li.thread .replies .replies li:before { ··· 976 992 } 977 993 978 994 .timeline .show-more { 979 - padding-inline-start: calc( 980 - var(--line-end) + var(--line-margin-end) 981 - ) !important; 995 + padding-inline-start: calc(var(--line-end) + var(--line-margin-end)) !important; 982 996 text-align: start; 983 997 background-color: transparent !important; 984 998 backdrop-filter: none !important; ··· 1069 1083 position: absolute; 1070 1084 inset: 0; 1071 1085 pointer-events: none; 1072 - background-image: 1073 - radial-gradient( 1086 + background-image: radial-gradient( 1074 1087 ellipse 50% 32px at bottom center, 1075 1088 var(--carousel-faded-color), 1076 1089 transparent 1077 - ), 1078 - linear-gradient(to top, var(--bg-color) 8px, transparent 64px); 1090 + ), linear-gradient(to top, var(--bg-color) 8px, transparent 64px); 1079 1091 background-repeat: no-repeat; 1080 1092 background-position: bottom center; 1081 1093 } ··· 2346 2358 var(--bg-color) var(--middle-circle-radius), 2347 2359 transparent var(--middle-circle-radius) 2348 2360 ); 2349 - background-image: 2350 - var(--middle-circle), 2361 + background-image: var(--middle-circle), 2351 2362 conic-gradient(var(--color) var(--fill), var(--outline-color) 0); 2352 2363 transform: scale(0.7); 2353 2364 &:dir(rtl) { ··· 2690 2701 } 2691 2702 #columns { 2692 2703 /* Any buttons except nav menu button on first header-side, on 1st column */ 2693 - .deck-container:first-of-type 2694 - .header-grid 2704 + .deck-container:first-of-type .header-grid 2695 2705 .header-side:first-of-type 2696 2706 > *:not(.nav-menu-button), 2697 2707 /* Any buttons on last header-side, on 1st column */ 2698 - .deck-container:first-of-type .header-grid .header-side:last-of-type > *, 2708 + .deck-container:first-of-type .header-grid 2709 + .header-side:last-of-type 2710 + > *, 2699 2711 /* Any buttons on any header-side, on columns after 1st */ 2700 - .deck-container:not(:first-of-type) .header-grid .header-side > * { 2712 + .deck-container:not(:first-of-type) .header-grid 2713 + .header-side 2714 + > * { 2701 2715 display: none; 2702 2716 } 2703 2717 }
+8 -10
src/components/account-info.css
··· 749 749 --shadow-spread: calc(var(--shadow-blur) * -0.75); 750 750 box-shadow: 751 751 calc(var(--shadow-offset) * -1) var(--shadow-offset) var(--shadow-blur) 752 - var(--shadow-spread) var(--header-color-1, var(--drop-shadow-color)), 752 + var(--shadow-spread) var(--header-color-1, var(--drop-shadow-color)), 753 753 var(--shadow-offset) var(--shadow-offset) var(--shadow-blur) 754 - var(--shadow-spread) var(--header-color-2, var(--drop-shadow-color)); 754 + var(--shadow-spread) var(--header-color-2, var(--drop-shadow-color)); 755 755 } 756 756 /* .timeline-start .account-container .header-banner { 757 757 margin-bottom: -77px; ··· 845 845 overflow: hidden; 846 846 border: 1px solid var(--outline-color); 847 847 /* checkerboard background */ 848 - background-image: 849 - linear-gradient(45deg, var(--img-bg-color) 25%, transparent 25%), 850 - linear-gradient(-45deg, var(--img-bg-color) 25%, transparent 25%), 848 + background-image: linear-gradient( 849 + 45deg, 850 + var(--img-bg-color) 25%, 851 + transparent 25% 852 + ), linear-gradient(-45deg, var(--img-bg-color) 25%, transparent 25%), 851 853 linear-gradient(45deg, transparent 75%, var(--img-bg-color) 75%), 852 854 linear-gradient(-45deg, transparent 75%, var(--img-bg-color) 75%); 853 855 background-size: 10px 10px; ··· 1046 1048 1047 1049 .account-block-content { 1048 1050 min-width: 0; 1049 - mask-image: linear-gradient( 1050 - var(--to-backward), 1051 - transparent, 1052 - black 16px 1053 - ); 1051 + mask-image: linear-gradient(var(--to-backward), transparent, black 16px); 1054 1052 } 1055 1053 1056 1054 .account-block-stats {
+1 -1
src/components/avatar.css
··· 1 1 .avatar { 2 2 display: inline-block; 3 3 line-height: 0; 4 - aspect-ratio: 1/1; 4 + aspect-ratio: 1 / 1; 5 5 border-radius: 50%; 6 6 overflow: hidden; 7 7 background-color: var(--bg-faded-color);
+10 -6
src/components/compose.css
··· 417 417 width: 80px; 418 418 height: 80px; 419 419 /* checkerboard background */ 420 - background-image: 421 - linear-gradient(45deg, var(--img-bg-color) 25%, transparent 25%), 422 - linear-gradient(-45deg, var(--img-bg-color) 25%, transparent 25%), 420 + background-image: linear-gradient( 421 + 45deg, 422 + var(--img-bg-color) 25%, 423 + transparent 25% 424 + ), linear-gradient(-45deg, var(--img-bg-color) 25%, transparent 25%), 423 425 linear-gradient(45deg, transparent 75%, var(--img-bg-color) 75%), 424 426 linear-gradient(-45deg, transparent 75%, var(--img-bg-color) 75%); 425 427 background-size: 10px 10px; ··· 685 687 overflow: hidden; 686 688 box-shadow: 0 2px 16px var(--img-bg-color); 687 689 /* checkerboard background */ 688 - background-image: 689 - linear-gradient(45deg, var(--img-bg-color) 25%, transparent 25%), 690 - linear-gradient(-45deg, var(--img-bg-color) 25%, transparent 25%), 690 + background-image: linear-gradient( 691 + 45deg, 692 + var(--img-bg-color) 25%, 693 + transparent 25% 694 + ), linear-gradient(-45deg, var(--img-bg-color) 25%, transparent 25%), 691 695 linear-gradient(45deg, transparent 75%, var(--img-bg-color) 75%), 692 696 linear-gradient(-45deg, transparent 75%, var(--img-bg-color) 75%); 693 697 background-size: 20px 20px;
+4 -2
src/components/compose.jsx
··· 1621 1621 <label 1622 1622 class={`toolbar-button ${ 1623 1623 language !== prevLanguage.current || 1624 - (autoDetectedLanguages?.length && 1625 - !autoDetectedLanguages.includes(language)) 1624 + ( 1625 + autoDetectedLanguages?.length && 1626 + !autoDetectedLanguages.includes(language) 1627 + ) 1626 1628 ? 'highlight' 1627 1629 : '' 1628 1630 }`}
+7 -8
src/components/keyboard-shortcuts-help.css
··· 24 24 line-height: 1; 25 25 border: 1px solid var(--outline-color); 26 26 background-color: var(--bg-faded-color); 27 - background-image: linear-gradient( 28 - to top, 29 - var(--bg-blur-color), 30 - transparent 31 - ); 27 + background-image: linear-gradient(to top, var(--bg-blur-color), transparent); 32 28 text-shadow: 0 1px var(--bg-color); 33 - box-shadow: 0 1px var(--drop-shadow-color), 34 - 0 1px 1px var(--drop-shadow-color), 0 1px 8px var(--drop-shadow-color), 29 + box-shadow: 30 + 0 1px var(--drop-shadow-color), 31 + 0 1px 1px var(--drop-shadow-color), 32 + 0 1px 8px var(--drop-shadow-color), 35 33 inset 0 1px var(--bg-blur-color); 36 34 37 35 &:active { 38 - box-shadow: 0 1px 4px var(--drop-shadow-color), 36 + box-shadow: 37 + 0 1px 4px var(--drop-shadow-color), 39 38 inset 0 1px var(--bg-blur-color); 40 39 transform: translateY(1px); 41 40 filter: brightness(0.95);
+2 -1
src/components/media-post.css
··· 79 79 --drop-shadow: var(--drop-shadow-color); 80 80 position: relative; 81 81 z-index: 1; 82 - box-shadow: 0 8px 16px -4px var(--drop-shadow), 82 + box-shadow: 83 + 0 8px 16px -4px var(--drop-shadow), 83 84 0 4px 8px var(--drop-shadow); 84 85 85 86 @media (prefers-color-scheme: dark) {
+7 -6
src/components/modal.css
··· 40 40 var(--compose-button-dimension-margin), 41 41 env(safe-area-inset-bottom) 42 42 ); 43 - --origin-end: calc( 44 - 100% - var(--compose-button-dimension-half) - var(--end) 45 - ); 43 + --origin-end: calc(100% - var(--compose-button-dimension-half) - var(--end)); 46 44 :dir(rtl) & { 47 45 --origin-end: calc(var(--compose-button-dimension-half) + var(--end)); 48 46 } 49 47 --origin-bottom: calc( 50 - 100% - var(--compose-button-dimension-half) - var(--bottom) 48 + 100% - 49 + var(--compose-button-dimension-half) - 50 + var(--bottom) 51 51 ); 52 52 transform-origin: var(--origin-end) var(--origin-bottom); 53 53 } ··· 67 67 border: 2px solid red; 68 68 69 69 --bottom: calc( 70 - var(--compose-button-dimension-margin) + env(safe-area-inset-bottom) + 71 - 52px 70 + var(--compose-button-dimension-margin) + 71 + env(safe-area-inset-bottom) + 72 + 52px 72 73 ); 73 74 } 74 75 }
+13 -5
src/components/nav-menu.css
··· 38 38 } 39 39 @keyframes phanpying { 40 40 0% { 41 - background-position: 0 0, 0 0, 3em 85%; 41 + background-position: 42 + 0 0, 43 + 0 0, 44 + 3em 85%; 42 45 } 43 46 100% { 44 - background-position: 0 0, 0 0, 2em 90%; 47 + background-position: 48 + 0 0, 49 + 0 0, 50 + 2em 90%; 45 51 } 46 52 } 47 53 .nav-menu section:last-child { ··· 54 60 to bottom var(--backward), 55 61 var(--bg-blur-color), 56 62 transparent 57 - ), 58 - url(../assets/phanpy-bg.svg); 63 + ), url(../assets/phanpy-bg.svg); 59 64 background-repeat: no-repeat; 60 65 /* background-size: auto, auto, 200%; */ 61 - background-position: 0 0, 0 0, 2em 90%; 66 + background-position: 67 + 0 0, 68 + 0 0, 69 + 2em 90%; 62 70 background-blend-mode: normal, normal, overlay; 63 71 box-shadow: inset 0 0 1px var(--bg-color); 64 72 position: sticky;
+1 -1
src/components/report-modal.jsx
··· 17 17 // NOTE: `dislike` hidden for now, it's actually not used for reporting 18 18 // Mastodon shows another screen for unfollowing, muting or blocking instead of reporting 19 19 20 - const CATEGORIES = [, /*'dislike'*/ 'spam', 'legal', 'violation', 'other']; 20 + const CATEGORIES = [/*'dislike'*/ , 'spam', 'legal', 'violation', 'other']; 21 21 // `violation` will be set if there are `rule_ids[]` 22 22 23 23 const CATEGORIES_INFO = {
+2 -1
src/components/search-command.css
··· 33 33 border-radius: 999px; 34 34 background-color: var(--bg-faded-color); 35 35 border: 2px solid var(--outline-color); 36 - box-shadow: 0 2px 16px var(--drop-shadow-color), 36 + box-shadow: 37 + 0 2px 16px var(--drop-shadow-color), 37 38 0 32px 64px var(--drop-shadow-color); 38 39 } 39 40 #search-command-container input:focus {
+2 -1
src/components/shortcuts-settings.css
··· 89 89 transition: opacity 0.2s ease-out; 90 90 } 91 91 #shortcuts-settings-container .shortcuts-view-mode label.checked { 92 - box-shadow: inset 0 0 0 3px var(--link-color), 92 + box-shadow: 93 + inset 0 0 0 3px var(--link-color), 93 94 inset 0 0 32px var(--link-faded-color); 94 95 } 95 96 #shortcuts-settings-container
+8 -6
src/components/shortcuts.css
··· 62 62 --tmp-inset-sides: max(var(--sai-left), var(--sai-right), 16px); 63 63 --tmp-inset-bottom: max(16px, var(--sai-bottom)); 64 64 --tmp-inset-new: calc( 65 - (var(--tmp-inset-sides) + var(--tmp-inset-bottom)) / 2.4 65 + (var(--tmp-inset-sides) + var(--tmp-inset-bottom)) / 66 + 2.4 66 67 ); 67 68 --inset-new: var(--tmp-inset-new); 68 69 } ··· 95 96 inset-inline-start: var(--inset-inline-start); 96 97 inset-block-end: max(16px, var(--inset-new)); 97 98 max-width: calc( 98 - 100vw - var(--inset-inline-start) - var(--inset-inline-end) - 99 - var(--compose-button-width) - 8px 99 + 100vw - 100 + var(--inset-inline-start) - 101 + var(--inset-inline-end) - 102 + var(--compose-button-width) - 103 + 8px 100 104 ); 101 105 border-radius: 999px; 102 106 box-shadow: ··· 116 120 body.exp-tab-bar-v2 { 117 121 #filters-page ~ #shortcuts .tab-bar:not([hidden]), 118 122 #lists-page ~ #shortcuts .tab-bar:not([hidden]) { 119 - max-width: calc( 120 - 100vw - var(--inset-inline-start) - var(--inset-inline-end) 121 - ); 123 + max-width: calc(100vw - var(--inset-inline-start) - var(--inset-inline-end)); 122 124 } 123 125 } 124 126 #shortcuts .tab-bar ul {
+6 -4
src/components/status.css
··· 163 163 color: var(--text-color); 164 164 } 165 165 .status-card-link:not( 166 - .truncated .status-card-link, /* parent status already truncated */ 166 + .truncated .status-card-link /* parent status already truncated */, 167 167 .status-card-link .status-card-link /* nested status cards */ 168 168 ):has(.truncated) { 169 169 display: block; ··· 421 421 inset-inline-start: var(--line-start); 422 422 width: var(--line-width); 423 423 height: calc( 424 - 100% - var(--top-padding) - var(--avatar-size) + (var(--top-padding) / 2) 424 + 100% - 425 + var(--top-padding) - 426 + var(--avatar-size) + 427 + (var(--top-padding) / 2) 425 428 ); 426 429 background-color: var(--comment-line-color); 427 430 z-index: 0; ··· 1404 1407 width: 100%; 1405 1408 height: 100%; 1406 1409 min-height: var(--min-dimension); 1407 - background-image: 1408 - radial-gradient( 1410 + background-image: radial-gradient( 1409 1411 circle at center center, 1410 1412 transparent, 1411 1413 var(--bg-faded-color)
+2 -3
src/index.css
··· 22 22 --main-width: 40em; 23 23 text-size-adjust: none; 24 24 --hairline-width: 1px; 25 - --monospace-font: 26 - ui-monospace, 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, 27 - monospace; 25 + --monospace-font: ui-monospace, 'SFMono-Regular', Consolas, 'Liberation Mono', 26 + Menlo, Courier, monospace; 28 27 29 28 --blue-color: royalblue; 30 29 --purple-color: blueviolet;
+59 -59
src/locales/en.po
··· 108 108 109 109 #: src/components/account-info.jsx:462 110 110 #: src/components/account-info.jsx:1236 111 - #: src/components/compose.jsx:2786 111 + #: src/components/compose.jsx:2788 112 112 #: src/components/media-alt-modal.jsx:55 113 113 #: src/components/media-modal.jsx:363 114 114 #: src/components/status.jsx:1836 ··· 450 450 #: src/components/account-info.jsx:2295 451 451 #: src/components/account-sheet.jsx:38 452 452 #: src/components/compose.jsx:891 453 - #: src/components/compose.jsx:2742 454 - #: src/components/compose.jsx:3222 455 - #: src/components/compose.jsx:3431 456 - #: src/components/compose.jsx:3661 453 + #: src/components/compose.jsx:2744 454 + #: src/components/compose.jsx:3224 455 + #: src/components/compose.jsx:3433 456 + #: src/components/compose.jsx:3663 457 457 #: src/components/drafts.jsx:59 458 458 #: src/components/embed-modal.jsx:13 459 459 #: src/components/generic-accounts.jsx:151 ··· 657 657 658 658 #: src/components/compose.jsx:664 659 659 #: src/components/compose.jsx:682 660 - #: src/components/compose.jsx:1792 661 - #: src/components/compose.jsx:1917 660 + #: src/components/compose.jsx:1794 661 + #: src/components/compose.jsx:1919 662 662 msgid "{maxMediaAttachments, plural, one {You can only attach up to 1 file.} other {You can only attach up to # files.}}" 663 663 msgstr "" 664 664 ··· 779 779 msgstr "Posting on <0/>" 780 780 781 781 #: src/components/compose.jsx:1447 782 - #: src/components/compose.jsx:3280 782 + #: src/components/compose.jsx:3282 783 783 #: src/components/shortcuts-settings.jsx:715 784 784 #: src/pages/list.jsx:388 785 785 msgid "Add" 786 786 msgstr "" 787 787 788 - #: src/components/compose.jsx:1673 788 + #: src/components/compose.jsx:1675 789 789 msgid "Schedule" 790 790 msgstr "Schedule" 791 791 792 - #: src/components/compose.jsx:1675 792 + #: src/components/compose.jsx:1677 793 793 #: src/components/keyboard-shortcuts-help.jsx:155 794 794 #: src/components/status.jsx:1030 795 795 #: src/components/status.jsx:1816 ··· 798 798 msgid "Reply" 799 799 msgstr "" 800 800 801 - #: src/components/compose.jsx:1677 801 + #: src/components/compose.jsx:1679 802 802 msgid "Update" 803 803 msgstr "Update" 804 804 805 - #: src/components/compose.jsx:1678 805 + #: src/components/compose.jsx:1680 806 806 msgctxt "Submit button in composer" 807 807 msgid "Post" 808 808 msgstr "Post" 809 809 810 - #: src/components/compose.jsx:1804 810 + #: src/components/compose.jsx:1806 811 811 msgid "Downloading GIF…" 812 812 msgstr "Downloading GIF…" 813 813 814 - #: src/components/compose.jsx:1832 814 + #: src/components/compose.jsx:1834 815 815 msgid "Failed to download GIF" 816 816 msgstr "Failed to download GIF" 817 817 818 - #: src/components/compose.jsx:2047 819 - #: src/components/compose.jsx:2124 818 + #: src/components/compose.jsx:2049 819 + #: src/components/compose.jsx:2126 820 820 #: src/components/nav-menu.jsx:244 821 821 msgid "More…" 822 822 msgstr "" 823 823 824 - #: src/components/compose.jsx:2556 824 + #: src/components/compose.jsx:2558 825 825 msgid "Uploaded" 826 826 msgstr "" 827 827 828 - #: src/components/compose.jsx:2569 828 + #: src/components/compose.jsx:2571 829 829 msgid "Image description" 830 830 msgstr "Image description" 831 831 832 - #: src/components/compose.jsx:2570 832 + #: src/components/compose.jsx:2572 833 833 msgid "Video description" 834 834 msgstr "Video description" 835 835 836 - #: src/components/compose.jsx:2571 836 + #: src/components/compose.jsx:2573 837 837 msgid "Audio description" 838 838 msgstr "Audio description" 839 839 ··· 841 841 #. placeholder {0}: prettyBytes( videoSize, ) 842 842 #. placeholder {1}: prettyBytes(imageSizeLimit) 843 843 #. placeholder {1}: prettyBytes(videoSizeLimit) 844 - #: src/components/compose.jsx:2606 845 - #: src/components/compose.jsx:2626 844 + #: src/components/compose.jsx:2608 845 + #: src/components/compose.jsx:2628 846 846 msgid "File size too large. Uploading might encounter issues. Try reduce the file size from {0} to {1} or lower." 847 847 msgstr "File size too large. Uploading might encounter issues. Try reduce the file size from {0} to {1} or lower." 848 848 ··· 850 850 #. placeholder {1}: i18n.number(height) 851 851 #. placeholder {2}: i18n.number(newWidth) 852 852 #. placeholder {3}: i18n.number( newHeight, ) 853 - #: src/components/compose.jsx:2618 854 - #: src/components/compose.jsx:2638 853 + #: src/components/compose.jsx:2620 854 + #: src/components/compose.jsx:2640 855 855 msgid "Dimension too large. Uploading might encounter issues. Try reduce dimension from {0}×{1}px to {2}×{3}px." 856 856 msgstr "Dimension too large. Uploading might encounter issues. Try reduce dimension from {0}×{1}px to {2}×{3}px." 857 857 858 - #: src/components/compose.jsx:2646 858 + #: src/components/compose.jsx:2648 859 859 msgid "Frame rate too high. Uploading might encounter issues." 860 860 msgstr "Frame rate too high. Uploading might encounter issues." 861 861 862 - #: src/components/compose.jsx:2706 863 - #: src/components/compose.jsx:2956 862 + #: src/components/compose.jsx:2708 863 + #: src/components/compose.jsx:2958 864 864 #: src/components/shortcuts-settings.jsx:726 865 865 #: src/pages/catchup.jsx:1081 866 866 #: src/pages/filters.jsx:413 867 867 msgid "Remove" 868 868 msgstr "" 869 869 870 - #: src/components/compose.jsx:2723 870 + #: src/components/compose.jsx:2725 871 871 #: src/compose.jsx:84 872 872 msgid "Error" 873 873 msgstr "" 874 874 875 - #: src/components/compose.jsx:2748 875 + #: src/components/compose.jsx:2750 876 876 msgid "Edit image description" 877 877 msgstr "Edit image description" 878 878 879 - #: src/components/compose.jsx:2749 879 + #: src/components/compose.jsx:2751 880 880 msgid "Edit video description" 881 881 msgstr "Edit video description" 882 882 883 - #: src/components/compose.jsx:2750 883 + #: src/components/compose.jsx:2752 884 884 msgid "Edit audio description" 885 885 msgstr "Edit audio description" 886 886 887 - #: src/components/compose.jsx:2795 888 - #: src/components/compose.jsx:2844 887 + #: src/components/compose.jsx:2797 888 + #: src/components/compose.jsx:2846 889 889 msgid "Generating description. Please wait…" 890 890 msgstr "Generating description. Please wait…" 891 891 892 892 #. placeholder {0}: e.message 893 - #: src/components/compose.jsx:2815 893 + #: src/components/compose.jsx:2817 894 894 msgid "Failed to generate description: {0}" 895 895 msgstr "Failed to generate description: {0}" 896 896 897 - #: src/components/compose.jsx:2816 897 + #: src/components/compose.jsx:2818 898 898 msgid "Failed to generate description" 899 899 msgstr "Failed to generate description" 900 900 901 - #: src/components/compose.jsx:2828 902 - #: src/components/compose.jsx:2834 903 - #: src/components/compose.jsx:2880 901 + #: src/components/compose.jsx:2830 902 + #: src/components/compose.jsx:2836 903 + #: src/components/compose.jsx:2882 904 904 msgid "Generate description…" 905 905 msgstr "" 906 906 907 907 #. placeholder {0}: e?.message ? `: ${e.message}` : '' 908 - #: src/components/compose.jsx:2867 908 + #: src/components/compose.jsx:2869 909 909 msgid "Failed to generate description{0}" 910 910 msgstr "Failed to generate description{0}" 911 911 912 912 #. placeholder {0}: localeCode2Text(lang) 913 - #: src/components/compose.jsx:2882 913 + #: src/components/compose.jsx:2884 914 914 msgid "({0}) <0>— experimental</0>" 915 915 msgstr "" 916 916 917 - #: src/components/compose.jsx:2901 917 + #: src/components/compose.jsx:2903 918 918 msgid "Done" 919 919 msgstr "" 920 920 921 921 #. placeholder {0}: i + 1 922 - #: src/components/compose.jsx:2937 922 + #: src/components/compose.jsx:2939 923 923 msgid "Choice {0}" 924 924 msgstr "Choice {0}" 925 925 926 - #: src/components/compose.jsx:2984 926 + #: src/components/compose.jsx:2986 927 927 msgid "Multiple choices" 928 928 msgstr "" 929 929 930 - #: src/components/compose.jsx:2987 930 + #: src/components/compose.jsx:2989 931 931 msgid "Duration" 932 932 msgstr "" 933 933 934 - #: src/components/compose.jsx:3018 934 + #: src/components/compose.jsx:3020 935 935 msgid "Remove poll" 936 936 msgstr "" 937 937 938 - #: src/components/compose.jsx:3239 938 + #: src/components/compose.jsx:3241 939 939 msgid "Search accounts" 940 940 msgstr "Search accounts" 941 941 942 - #: src/components/compose.jsx:3293 942 + #: src/components/compose.jsx:3295 943 943 #: src/components/generic-accounts.jsx:236 944 944 msgid "Error loading accounts" 945 945 msgstr "" 946 946 947 - #: src/components/compose.jsx:3437 947 + #: src/components/compose.jsx:3439 948 948 msgid "Custom emojis" 949 949 msgstr "" 950 950 951 - #: src/components/compose.jsx:3457 951 + #: src/components/compose.jsx:3459 952 952 msgid "Search emoji" 953 953 msgstr "Search emoji" 954 954 955 - #: src/components/compose.jsx:3488 955 + #: src/components/compose.jsx:3490 956 956 msgid "Error loading custom emojis" 957 957 msgstr "" 958 958 959 - #: src/components/compose.jsx:3499 959 + #: src/components/compose.jsx:3501 960 960 msgid "Recently used" 961 961 msgstr "Recently used" 962 962 963 - #: src/components/compose.jsx:3500 963 + #: src/components/compose.jsx:3502 964 964 msgid "Others" 965 965 msgstr "Others" 966 966 967 967 #. placeholder {0}: i18n.number(emojis.length - max) 968 - #: src/components/compose.jsx:3538 968 + #: src/components/compose.jsx:3540 969 969 msgid "{0} more…" 970 970 msgstr "" 971 971 972 - #: src/components/compose.jsx:3676 972 + #: src/components/compose.jsx:3678 973 973 msgid "Search GIFs" 974 974 msgstr "Search GIFs" 975 975 976 - #: src/components/compose.jsx:3691 976 + #: src/components/compose.jsx:3693 977 977 msgid "Powered by GIPHY" 978 978 msgstr "Powered by GIPHY" 979 979 980 - #: src/components/compose.jsx:3699 980 + #: src/components/compose.jsx:3701 981 981 msgid "Type to search GIFs" 982 982 msgstr "" 983 983 984 - #: src/components/compose.jsx:3797 984 + #: src/components/compose.jsx:3799 985 985 #: src/components/media-modal.jsx:469 986 986 #: src/components/timeline.jsx:927 987 987 msgid "Previous" 988 988 msgstr "" 989 989 990 - #: src/components/compose.jsx:3815 990 + #: src/components/compose.jsx:3817 991 991 #: src/components/media-modal.jsx:488 992 992 #: src/components/timeline.jsx:944 993 993 msgid "Next" 994 994 msgstr "" 995 995 996 - #: src/components/compose.jsx:3832 996 + #: src/components/compose.jsx:3834 997 997 msgid "Error loading GIFs" 998 998 msgstr "" 999 999
+3 -1
src/pages/account-statuses.jsx
··· 664 664 <option 665 665 value={ 666 666 // Month is 1-indexed 667 - (i + 1).toString().padStart(2, '0') 667 + (i + 1) 668 + .toString() 669 + .padStart(2, '0') 668 670 } 669 671 key={i} 670 672 >
+3 -1
src/pages/accounts.css
··· 36 36 opacity: 1; 37 37 } 38 38 #accounts-container section > ul > li .current.is-current + .avatar { 39 - box-shadow: 0 0 0 1.5px var(--green-color), 0 0 8px var(--green-color); 39 + box-shadow: 40 + 0 0 0 1.5px var(--green-color), 41 + 0 0 8px var(--green-color); 40 42 } 41 43 #accounts-container section > ul > li .avatar + .name-text { 42 44 vertical-align: middle;
+1 -2
src/pages/catchup.css
··· 45 45 transform: translateY(-10vh); 46 46 color: var(--text-color); 47 47 background-color: var(--bg-color); 48 - background-image: 49 - radial-gradient( 48 + background-image: radial-gradient( 50 49 farthest-corner at 25% 0, 51 50 transparent 80%, 52 51 var(--bg-faded-color) 95%,
+5 -2
src/pages/notifications.css
··· 163 163 color: var(--text-color); 164 164 background-color: var(--bg-faded-color); 165 165 border: 1px dashed var(--link-color); 166 - box-shadow: 0 0 0 1px var(--bg-color), 0 -5px 10px var(--bg-color), 167 - 0 -5px 15px var(--bg-color), 0 -5px 20px var(--bg-color); 166 + box-shadow: 167 + 0 0 0 1px var(--bg-color), 168 + 0 -5px 10px var(--bg-color), 169 + 0 -5px 15px var(--bg-color), 170 + 0 -5px 20px var(--bg-color); 168 171 padding: 0.5em 0.75em; 169 172 border-radius: 10em; 170 173 font-size: 90%;
+4 -3
src/pages/sandbox.css
··· 35 35 padding: 16px; 36 36 background-color: var(--bg-color); 37 37 /* checkered background */ 38 - background-image: 39 - linear-gradient(var(--bg-faded-color) 2px, transparent 2px), 40 - linear-gradient(90deg, var(--bg-faded-color) 2px, transparent 2px), 38 + background-image: linear-gradient( 39 + var(--bg-faded-color) 2px, 40 + transparent 2px 41 + ), linear-gradient(90deg, var(--bg-faded-color) 2px, transparent 2px), 41 42 linear-gradient(var(--bg-faded-color) 1px, transparent 1px), 42 43 linear-gradient(90deg, var(--bg-faded-color) 1px, transparent 1px); 43 44 background-size:
+2 -2
src/pages/sandbox.jsx
··· 3 3 import { useEffect, useState } from 'preact/hooks'; 4 4 import { uid } from 'uid/single'; 5 5 6 + import testAudioURL from '../assets/sandbox/big-buck-bunny.mp3'; 7 + import testVideoURL from '../assets/sandbox/big-buck-bunny.webm'; 6 8 import testGIFURL from '../assets/sandbox/big-buck-bunny-muted.webm'; 7 9 import testPreviewURL from '../assets/sandbox/big-buck-bunny-preview.png'; 8 - import testAudioURL from '../assets/sandbox/big-buck-bunny.mp3'; 9 - import testVideoURL from '../assets/sandbox/big-buck-bunny.webm'; 10 10 11 11 import Status from '../components/status'; 12 12 import { getPreferences } from '../utils/api';
+1 -2
src/pages/welcome.css
··· 4 4 circle at center, 5 5 var(--bg-color), 6 6 transparent 16em 7 - ), 8 - radial-gradient(circle at center, var(--bg-color), transparent 8em); 7 + ), radial-gradient(circle at center, var(--bg-color), transparent 8em); 9 8 background-repeat: no-repeat; 10 9 background-attachment: fixed; 11 10 cursor: default;
+1 -1
src/pages/welcome.jsx
··· 7 7 import multiColumnUrl from '../assets/features/multi-column.jpg'; 8 8 import multiHashtagTimelineUrl from '../assets/features/multi-hashtag-timeline.jpg'; 9 9 import nestedCommentsThreadUrl from '../assets/features/nested-comments-thread.jpg'; 10 - import logoText from '../assets/logo-text.svg'; 11 10 import logo from '../assets/logo.svg'; 11 + import logoText from '../assets/logo-text.svg'; 12 12 13 13 import LangSelector from '../components/lang-selector'; 14 14 import Link from '../components/link';