From 9b8bccd27d6065dc0e32777d26ed0c13cbe93a2b Mon Sep 17 00:00:00 2001 From: Pleroma Renovate Bot Date: Sat, 23 Aug 2025 08:52:09 +0000 Subject: [PATCH 01/38] Update dependency chai to v5.3.3 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 7652d47eb..c3af54511 100644 --- a/package.json +++ b/package.json @@ -70,7 +70,7 @@ "@vue/test-utils": "2.4.6", "autoprefixer": "10.4.21", "babel-plugin-lodash": "3.3.4", - "chai": "5.3.2", + "chai": "5.3.3", "chalk": "5.6.0", "chromedriver": "135.0.4", "connect-history-api-fallback": "2.0.0", diff --git a/yarn.lock b/yarn.lock index dbcbb5127..56648cb9b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2962,10 +2962,10 @@ chai-nightwatch@^0.5.3: dependencies: assertion-error "1.1.0" -chai@5.3.2: - version "5.3.2" - resolved "https://registry.yarnpkg.com/chai/-/chai-5.3.2.tgz#e2c35570b8fa23b5b7129b4114d5dc03b3fd3401" - integrity sha512-kx7GHSOBiiIQ+DDgMP6YMtYkb/3Usm2nUYblNEM9P+/OfkuP7OjfoDlq/DCe1OU0GsREUa0rNAxZmzxgO6+jWg== +chai@5.3.3: + version "5.3.3" + resolved "https://registry.yarnpkg.com/chai/-/chai-5.3.3.tgz#dd3da955e270916a4bd3f625f4b919996ada7e06" + integrity sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw== dependencies: assertion-error "^2.0.1" check-error "^2.1.1" From 53afb86da1e5936dec778f27c8e444d32cef1d23 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Thu, 18 Sep 2025 18:30:46 +0300 Subject: [PATCH 02/38] 2.9.3 --- CHANGELOG.md | 4 ++++ package.json | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ded5c6e4d..20c9c2693 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). +## 2.9.3 +### Fixed +- Being unable to update profile + ## 2.9.2 ### Changed - BREAKING: due to some internal technical changes logging into AdminFE through PleromaFE is no longer possible diff --git a/package.json b/package.json index edc122760..77be1b5b3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pleroma_fe", - "version": "2.9.2", + "version": "2.9.3", "description": "Pleroma frontend, the default frontend of Pleroma social network server", "author": "Pleroma contributors ", "private": false, From fb828b07f9949afa6bc623e6e91f56848982be63 Mon Sep 17 00:00:00 2001 From: Pleroma Renovate Bot Date: Thu, 25 Sep 2025 09:07:21 +0000 Subject: [PATCH 03/38] Update vue monorepo to v3.5.22 --- package.json | 4 +- yarn.lock | 137 ++++++++++++++++++++++++++++++++++++++------------- 2 files changed, 105 insertions(+), 36 deletions(-) diff --git a/package.json b/package.json index 77be1b5b3..a3a99144b 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "url": "0.11.4", "utf8": "3.0.0", "uuid": "11.1.0", - "vue": "3.5.19", + "vue": "3.5.22", "vue-i18n": "11", "vue-router": "4.5.1", "vue-virtual-scroller": "^2.0.0-beta.7", @@ -66,7 +66,7 @@ "@vitest/ui": "^3.0.7", "@vue/babel-helper-vue-jsx-merge-props": "1.4.0", "@vue/babel-plugin-jsx": "1.5.0", - "@vue/compiler-sfc": "3.5.19", + "@vue/compiler-sfc": "3.5.22", "@vue/test-utils": "2.4.6", "autoprefixer": "10.4.21", "babel-plugin-lodash": "3.3.4", diff --git a/yarn.lock b/yarn.lock index dbcbb5127..1dfe38348 100644 --- a/yarn.lock +++ b/yarn.lock @@ -321,6 +321,13 @@ dependencies: "@babel/types" "^7.28.2" +"@babel/parser@^7.28.4": + version "7.28.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.4.tgz#da25d4643532890932cc03f7705fe19637e03fa8" + integrity sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg== + dependencies: + "@babel/types" "^7.28.4" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.27.1": version "7.27.1" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz#61dd8a8e61f7eb568268d1b5f129da3eee364bf9" @@ -987,6 +994,14 @@ "@babel/helper-string-parser" "^7.27.1" "@babel/helper-validator-identifier" "^7.27.1" +"@babel/types@^7.28.4": + version "7.28.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.4.tgz#0a4e618f4c60a7cd6c11cb2d48060e4dbe38ac3a" + integrity sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q== + dependencies: + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.27.1" + "@bazel/runfiles@^6.3.1": version "6.3.1" resolved "https://registry.yarnpkg.com/@bazel/runfiles/-/runfiles-6.3.1.tgz#3f8824b2d82853377799d42354b4df78ab0ace0b" @@ -2224,6 +2239,17 @@ estree-walker "^2.0.2" source-map-js "^1.2.1" +"@vue/compiler-core@3.5.22": + version "3.5.22" + resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.5.22.tgz#bb8294a0dd31df540563cc6ffa0456f1f7687b97" + integrity sha512-jQ0pFPmZwTEiRNSb+i9Ow/I/cHv2tXYqsnHKKyCQ08irI2kdF5qmYedmF8si8mA7zepUFmJ2hqzS8CQmNOWOkQ== + dependencies: + "@babel/parser" "^7.28.4" + "@vue/shared" "3.5.22" + entities "^4.5.0" + estree-walker "^2.0.2" + source-map-js "^1.2.1" + "@vue/compiler-dom@3.5.19": version "3.5.19" resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.5.19.tgz#fc57d9dca4987df67d6ce64dbddaac6d73f1a6ef" @@ -2232,7 +2258,30 @@ "@vue/compiler-core" "3.5.19" "@vue/shared" "3.5.19" -"@vue/compiler-sfc@3.5.19", "@vue/compiler-sfc@^3.5.18": +"@vue/compiler-dom@3.5.22": + version "3.5.22" + resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.5.22.tgz#6c9c2c9843520f6d3dbc685e5d0e1e12a2c04c56" + integrity sha512-W8RknzUM1BLkypvdz10OVsGxnMAuSIZs9Wdx1vzA3mL5fNMN15rhrSCLiTm6blWeACwUwizzPVqGJgOGBEN/hA== + dependencies: + "@vue/compiler-core" "3.5.22" + "@vue/shared" "3.5.22" + +"@vue/compiler-sfc@3.5.22": + version "3.5.22" + resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.5.22.tgz#663a8483b1dda8de83b6fa1aab38a52bf73dd965" + integrity sha512-tbTR1zKGce4Lj+JLzFXDq36K4vcSZbJ1RBu8FxcDv1IGRz//Dh2EBqksyGVypz3kXpshIfWKGOCcqpSbyGWRJQ== + dependencies: + "@babel/parser" "^7.28.4" + "@vue/compiler-core" "3.5.22" + "@vue/compiler-dom" "3.5.22" + "@vue/compiler-ssr" "3.5.22" + "@vue/shared" "3.5.22" + estree-walker "^2.0.2" + magic-string "^0.30.19" + postcss "^8.5.6" + source-map-js "^1.2.1" + +"@vue/compiler-sfc@^3.5.18": version "3.5.19" resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.5.19.tgz#7f9792ad7de5d4be9b6a32129c75e1f6cd4da015" integrity sha512-YWCm1CYaJ+2RvNmhCwI7t3I3nU+hOrWGWMsn+Z/kmm1jy5iinnVtlmkiZwbLlbV1SRizX7vHsc0/bG5dj0zRTg== @@ -2255,6 +2304,14 @@ "@vue/compiler-dom" "3.5.19" "@vue/shared" "3.5.19" +"@vue/compiler-ssr@3.5.22": + version "3.5.22" + resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.5.22.tgz#a0ef16e364731b25e79a13470569066af101320f" + integrity sha512-GdgyLvg4R+7T8Nk2Mlighx7XGxq/fJf9jaVofc3IL0EPesTE86cP/8DD1lT3h1JeZr2ySBvyqKQJgbS54IX1Ww== + dependencies: + "@vue/compiler-dom" "3.5.22" + "@vue/shared" "3.5.22" + "@vue/devtools-api@^6.0.0-beta.11", "@vue/devtools-api@^6.5.0", "@vue/devtools-api@^6.6.4": version "6.6.4" resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz#cbe97fe0162b365edc1dba80e173f90492535343" @@ -2287,44 +2344,49 @@ dependencies: rfdc "^1.4.1" -"@vue/reactivity@3.5.19": - version "3.5.19" - resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.5.19.tgz#c06f172da26e2fc74060cc490d1c3aaffc024622" - integrity sha512-4bueZg2qs5MSsK2dQk3sssV0cfvxb/QZntTC8v7J448GLgmfPkQ+27aDjlt40+XFqOwUq5yRxK5uQh14Fc9eVA== +"@vue/reactivity@3.5.22": + version "3.5.22" + resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.5.22.tgz#9b26f8557c96df46c9a859914a2229f3ca5b8f4f" + integrity sha512-f2Wux4v/Z2pqc9+4SmgZC1p73Z53fyD90NFWXiX9AKVnVBEvLFOWCEgJD3GdGnlxPZt01PSlfmLqbLYzY/Fw4A== dependencies: - "@vue/shared" "3.5.19" + "@vue/shared" "3.5.22" -"@vue/runtime-core@3.5.19": - version "3.5.19" - resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.5.19.tgz#7af375addd88b8be0a3a90162112bb98f92a9359" - integrity sha512-TaooCr8Hge1sWjLSyhdubnuofs3shhzZGfyD11gFolZrny76drPwBVQj28/z/4+msSFb18tOIg6VVVgf9/IbIA== +"@vue/runtime-core@3.5.22": + version "3.5.22" + resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.5.22.tgz#e004c1e35f423555a0e4c10646ef3e9d380643d1" + integrity sha512-EHo4W/eiYeAzRTN5PCextDUZ0dMs9I8mQ2Fy+OkzvRPUYQEyK9yAjbasrMCXbLNhF7P0OUyivLjIy0yc6VrLJQ== dependencies: - "@vue/reactivity" "3.5.19" - "@vue/shared" "3.5.19" + "@vue/reactivity" "3.5.22" + "@vue/shared" "3.5.22" -"@vue/runtime-dom@3.5.19": - version "3.5.19" - resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.5.19.tgz#b8cb4101778a306bdb64b5faba539a90ecce712c" - integrity sha512-qmahqeok6ztuUTmV8lqd7N9ymbBzctNF885n8gL3xdCC1u2RnM/coX16Via0AiONQXUoYpxPojL3U1IsDgSWUQ== +"@vue/runtime-dom@3.5.22": + version "3.5.22" + resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.5.22.tgz#01276cea7cb9ac2b9aba046adfb5903b494e2e7e" + integrity sha512-Av60jsryAkI023PlN7LsqrfPvwfxOd2yAwtReCjeuugTJTkgrksYJJstg1e12qle0NarkfhfFu1ox2D+cQotww== dependencies: - "@vue/reactivity" "3.5.19" - "@vue/runtime-core" "3.5.19" - "@vue/shared" "3.5.19" + "@vue/reactivity" "3.5.22" + "@vue/runtime-core" "3.5.22" + "@vue/shared" "3.5.22" csstype "^3.1.3" -"@vue/server-renderer@3.5.19": - version "3.5.19" - resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.5.19.tgz#68269701e73640ec0b861fcaff5cc77331d245e9" - integrity sha512-ZJ/zV9SQuaIO+BEEVq/2a6fipyrSYfjKMU3267bPUk+oTx/hZq3RzV7VCh0Unlppt39Bvh6+NzxeopIFv4HJNg== +"@vue/server-renderer@3.5.22": + version "3.5.22" + resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.5.22.tgz#d134e3409094044bd066d9803714677457756157" + integrity sha512-gXjo+ao0oHYTSswF+a3KRHZ1WszxIqO7u6XwNHqcqb9JfyIL/pbWrrh/xLv7jeDqla9u+LK7yfZKHih1e1RKAQ== dependencies: - "@vue/compiler-ssr" "3.5.19" - "@vue/shared" "3.5.19" + "@vue/compiler-ssr" "3.5.22" + "@vue/shared" "3.5.22" "@vue/shared@3.5.19", "@vue/shared@^3.5.18": version "3.5.19" resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.5.19.tgz#5301967a910cb62145e4f17131f3bee88b463c83" integrity sha512-IhXCOn08wgKrLQxRFKKlSacWg4Goi1BolrdEeLYn6tgHjJNXVrWJ5nzoxZqNwl5p88aLlQ8LOaoMa3AYvaKJ/Q== +"@vue/shared@3.5.22": + version "3.5.22" + resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.5.22.tgz#9d56a1644a3becb8af1e34655928b0e288d827f8" + integrity sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w== + "@vue/test-utils@2.4.6": version "2.4.6" resolved "https://registry.yarnpkg.com/@vue/test-utils/-/test-utils-2.4.6.tgz#7d534e70c4319d2a587d6a3b45a39e9695ade03c" @@ -5637,6 +5699,13 @@ magic-string@^0.30.17: dependencies: "@jridgewell/sourcemap-codec" "^1.5.5" +magic-string@^0.30.19: + version "0.30.19" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.19.tgz#cebe9f104e565602e5d2098c5f2e79a77cc86da9" + integrity sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.5" + make-dir@^2.0.0, make-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" @@ -7914,16 +7983,16 @@ vue-virtual-scroller@^2.0.0-beta.7: vue-observe-visibility "^2.0.0-alpha.1" vue-resize "^2.0.0-alpha.1" -vue@3.5.19: - version "3.5.19" - resolved "https://registry.yarnpkg.com/vue/-/vue-3.5.19.tgz#973ba643a331bd35578eec2a27fa115f500eb25b" - integrity sha512-ZRh0HTmw6KChRYWgN8Ox/wi7VhpuGlvMPrHjIsdRbzKNgECFLzy+dKL5z9yGaBSjCpmcfJCbh3I1tNSRmBz2tg== +vue@3.5.22: + version "3.5.22" + resolved "https://registry.yarnpkg.com/vue/-/vue-3.5.22.tgz#2b8ddb94ee4b640ef12fe7f6efe1cf16f3b582e7" + integrity sha512-toaZjQ3a/G/mYaLSbV+QsQhIdMo9x5rrqIpYRObsJ6T/J+RyCSFwN2LHNVH9v8uIcljDNa3QzPVdv3Y6b9hAJQ== dependencies: - "@vue/compiler-dom" "3.5.19" - "@vue/compiler-sfc" "3.5.19" - "@vue/runtime-dom" "3.5.19" - "@vue/server-renderer" "3.5.19" - "@vue/shared" "3.5.19" + "@vue/compiler-dom" "3.5.22" + "@vue/compiler-sfc" "3.5.22" + "@vue/runtime-dom" "3.5.22" + "@vue/server-renderer" "3.5.22" + "@vue/shared" "3.5.22" vuex@4.1.0: version "4.1.0" From df05a7a8a794d2d23d92ac21cfeab917a01315ef Mon Sep 17 00:00:00 2001 From: Pleroma Renovate Bot Date: Thu, 25 Sep 2025 09:08:13 +0000 Subject: [PATCH 04/38] Update dependency sass to v1.93.2 --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 77be1b5b3..f6e069b49 100644 --- a/package.json +++ b/package.json @@ -96,7 +96,7 @@ "postcss": "8.5.6", "postcss-html": "^1.5.0", "postcss-scss": "^4.0.6", - "sass": "1.89.2", + "sass": "1.93.2", "selenium-server": "3.141.59", "semver": "7.7.2", "serve-static": "2.2.0", diff --git a/yarn.lock b/yarn.lock index dbcbb5127..fde773f89 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6844,10 +6844,10 @@ safe-regex-test@^1.1.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sass@1.89.2: - version "1.89.2" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.89.2.tgz#a771716aeae774e2b529f72c0ff2dfd46c9de10e" - integrity sha512-xCmtksBKd/jdJ9Bt9p7nPKiuqrlBMBuuGkQlkhZjjQk3Ty48lv93k5Dq6OPkKt4XwxDJ7tvlfrTa1MPA9bf+QA== +sass@1.93.2: + version "1.93.2" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.93.2.tgz#e97d225d60f59a3b3dbb6d2ae3c1b955fd1f2cd1" + integrity sha512-t+YPtOQHpGW1QWsh1CHQ5cPIr9lbbGZLZnbihP/D/qZj/yuV68m8qarcV17nvkOX81BCrvzAlq2klCQFZghyTg== dependencies: chokidar "^4.0.0" immutable "^5.0.2" From 326d4976a3a9efd86f3ab84e3e3aecbc63ff0b61 Mon Sep 17 00:00:00 2001 From: Pleroma Renovate Bot Date: Sat, 4 Oct 2025 08:51:40 +0000 Subject: [PATCH 05/38] Update dependency eslint to v9.37.0 --- package.json | 2 +- yarn.lock | 63 ++++++++++++++++++++++++++++++---------------------- 2 files changed, 37 insertions(+), 28 deletions(-) diff --git a/package.json b/package.json index 77be1b5b3..19dc3d94d 100644 --- a/package.json +++ b/package.json @@ -76,7 +76,7 @@ "connect-history-api-fallback": "2.0.0", "cross-spawn": "7.0.6", "custom-event-polyfill": "1.0.7", - "eslint": "9.33.0", + "eslint": "9.37.0", "vue-eslint-parser": "10.2.0", "eslint-config-standard": "17.1.0", "eslint-formatter-friendly": "7.0.0", diff --git a/yarn.lock b/yarn.lock index dbcbb5127..3d08fe4d2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1291,13 +1291,20 @@ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz#0b17ec8a70b2385827d52314c1253160a0b9bacc" integrity sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ== -"@eslint-community/eslint-utils@^4.1.2", "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0", "@eslint-community/eslint-utils@^4.5.0": +"@eslint-community/eslint-utils@^4.1.2", "@eslint-community/eslint-utils@^4.4.0", "@eslint-community/eslint-utils@^4.5.0": version "4.5.1" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.5.1.tgz#b0fc7e06d0c94f801537fd4237edc2706d3b8e4c" integrity sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w== dependencies: eslint-visitor-keys "^3.4.3" +"@eslint-community/eslint-utils@^4.8.0": + version "4.9.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz#7308df158e064f0dd8b8fdb58aa14fa2a7f913b3" + integrity sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g== + dependencies: + eslint-visitor-keys "^3.4.3" + "@eslint-community/regexpp@^4.11.0", "@eslint-community/regexpp@^4.12.1": version "4.12.1" resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" @@ -1312,15 +1319,17 @@ debug "^4.3.1" minimatch "^3.1.2" -"@eslint/config-helpers@^0.3.1": - version "0.3.1" - resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.3.1.tgz#d316e47905bd0a1a931fa50e669b9af4104d1617" - integrity sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA== +"@eslint/config-helpers@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.4.0.tgz#e9f94ba3b5b875e32205cb83fece18e64486e9e6" + integrity sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog== + dependencies: + "@eslint/core" "^0.16.0" -"@eslint/core@^0.15.2": - version "0.15.2" - resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.15.2.tgz#59386327d7862cc3603ebc7c78159d2dcc4a868f" - integrity sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg== +"@eslint/core@^0.16.0": + version "0.16.0" + resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.16.0.tgz#490254f275ba9667ddbab344f4f0a6b7a7bd7209" + integrity sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q== dependencies: "@types/json-schema" "^7.0.15" @@ -1339,22 +1348,22 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@9.33.0": - version "9.33.0" - resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.33.0.tgz#475c92fdddab59b8b8cab960e3de2564a44bf368" - integrity sha512-5K1/mKhWaMfreBGJTwval43JJmkip0RmM+3+IuqupeSKNC/Th2Kc7ucaq5ovTSra/OOKB9c58CGSz3QMVbWt0A== +"@eslint/js@9.37.0": + version "9.37.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.37.0.tgz#0cfd5aa763fe5d1ee60bedf84cd14f54bcf9e21b" + integrity sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg== "@eslint/object-schema@^2.1.6": version "2.1.6" resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.6.tgz#58369ab5b5b3ca117880c0f6c0b0f32f6950f24f" integrity sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA== -"@eslint/plugin-kit@^0.3.5": - version "0.3.5" - resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz#fd8764f0ee79c8ddab4da65460c641cefee017c5" - integrity sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w== +"@eslint/plugin-kit@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz#f6a245b42886abf6fc9c7ab7744a932250335ab2" + integrity sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A== dependencies: - "@eslint/core" "^0.15.2" + "@eslint/core" "^0.16.0" levn "^0.4.1" "@fortawesome/fontawesome-common-types@6.7.2": @@ -4104,19 +4113,19 @@ eslint-visitor-keys@^4.2.1: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz#4cfea60fe7dd0ad8e816e1ed026c1d5251b512c1" integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== -eslint@9.33.0: - version "9.33.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.33.0.tgz#cc186b3d9eb0e914539953d6a178a5b413997b73" - integrity sha512-TS9bTNIryDzStCpJN93aC5VRSW3uTx9sClUn4B87pwiCaJh220otoI0X8mJKr+VcPtniMdN8GKjlwgWGUv5ZKA== +eslint@9.37.0: + version "9.37.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.37.0.tgz#ac0222127f76b09c0db63036f4fe289562072d74" + integrity sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig== dependencies: - "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/eslint-utils" "^4.8.0" "@eslint-community/regexpp" "^4.12.1" "@eslint/config-array" "^0.21.0" - "@eslint/config-helpers" "^0.3.1" - "@eslint/core" "^0.15.2" + "@eslint/config-helpers" "^0.4.0" + "@eslint/core" "^0.16.0" "@eslint/eslintrc" "^3.3.1" - "@eslint/js" "9.33.0" - "@eslint/plugin-kit" "^0.3.5" + "@eslint/js" "9.37.0" + "@eslint/plugin-kit" "^0.4.0" "@humanfs/node" "^0.16.6" "@humanwhocodes/module-importer" "^1.0.1" "@humanwhocodes/retry" "^0.4.2" From 7a919e7c76dba09499437c8d5c287b0206b45a05 Mon Sep 17 00:00:00 2001 From: Pleroma Renovate Bot Date: Sat, 4 Oct 2025 08:52:01 +0000 Subject: [PATCH 06/38] Update dependency stylelint to v16.25.0 --- package.json | 2 +- yarn.lock | 185 ++++++++++++++++++++++++++++++--------------------- 2 files changed, 111 insertions(+), 76 deletions(-) diff --git a/package.json b/package.json index 77be1b5b3..3f7981941 100644 --- a/package.json +++ b/package.json @@ -103,7 +103,7 @@ "shelljs": "0.10.0", "sinon": "20.0.0", "sinon-chai": "4.0.0", - "stylelint": "16.19.1", + "stylelint": "16.25.0", "stylelint-config-html": "^1.1.0", "stylelint-config-recommended": "^16.0.0", "stylelint-config-recommended-scss": "^14.0.0", diff --git a/yarn.lock b/yarn.lock index dbcbb5127..139286417 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1014,6 +1014,29 @@ "@types/tough-cookie" "^4.0.5" tough-cookie "^4.1.4" +"@cacheable/memoize@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@cacheable/memoize/-/memoize-2.0.3.tgz#64b18a6b42f987fe8a9e9e2e4391b14cbf85680f" + integrity sha512-hl9wfQgpiydhQEIv7fkjEzTGE+tcosCXLKFDO707wYJ/78FVOlowb36djex5GdbSyeHnG62pomYLMuV/OT8Pbw== + dependencies: + "@cacheable/utils" "^2.0.3" + +"@cacheable/memory@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@cacheable/memory/-/memory-2.0.3.tgz#8d8fa1644b32b85f27c7e4e16e14f36a8460735c" + integrity sha512-R3UKy/CKOyb1LZG/VRCTMcpiMDyLH7SH3JrraRdK6kf3GweWCOU3sgvE13W3TiDRbxnDKylzKJvhUAvWl9LQOA== + dependencies: + "@cacheable/memoize" "^2.0.3" + "@cacheable/utils" "^2.0.3" + "@keyv/bigmap" "^1.0.2" + hookified "^1.12.1" + keyv "^5.5.3" + +"@cacheable/utils@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@cacheable/utils/-/utils-2.0.3.tgz#45d62f5dd3b481ef62677335bada2cbdb579148b" + integrity sha512-m7Rce68cMHlAUjvWBy9Ru1Nmw5gU0SjGGtQDdhpe6E0xnbcvrIY0Epy//JU1VYYBUTzrG9jvgmTauULGKzOkWA== + "@chenfengyuan/vue-qrcode@2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@chenfengyuan/vue-qrcode/-/vue-qrcode-2.0.0.tgz#8cd01f6fc528d471680ebe812ec47c830aea7e63" @@ -1146,25 +1169,35 @@ resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz#74426e93bd1c4dcab3e441f5cc7ba4fb35d94356" integrity sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A== +"@csstools/css-parser-algorithms@^3.0.5": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz#5755370a9a29abaec5515b43c8b3f2cf9c2e3076" + integrity sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ== + "@csstools/css-tokenizer@^3.0.3": version "3.0.3" resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz#a5502c8539265fecbd873c1e395a890339f119c2" integrity sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw== -"@csstools/media-query-list-parser@^4.0.2": - version "4.0.2" - resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.2.tgz#e80e17eba1693fceafb8d6f2cfc68c0e7a9ab78a" - integrity sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A== +"@csstools/css-tokenizer@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz#333fedabc3fd1a8e5d0100013731cf19e6a8c5d3" + integrity sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw== + +"@csstools/media-query-list-parser@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz#7aec77bcb89c2da80ef207e73f474ef9e1b3cdf1" + integrity sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ== "@csstools/selector-specificity@^5.0.0": version "5.0.0" resolved "https://registry.yarnpkg.com/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz#037817b574262134cabd68fc4ec1a454f168407b" integrity sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw== -"@dual-bundle/import-meta-resolve@^4.1.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz#519c1549b0e147759e7825701ecffd25e5819f7b" - integrity sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg== +"@dual-bundle/import-meta-resolve@^4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.2.1.tgz#cd0b25b3808cd9e684cd6cd549bbf8e1dcf05ee7" + integrity sha512-id+7YRUgoUX6CgV0DtuhirQWodeeA7Lf4i2x71JS/vtA5pRb/hIGWlw+G6MeXvsM+MXrz0VAydTGElX1rAfgPg== "@esbuild/aix-ppc64@0.25.4": version "0.25.4" @@ -1519,12 +1552,17 @@ resolved "https://registry.yarnpkg.com/@kazvmoe-infra/unicode-emoji-json/-/unicode-emoji-json-0.4.0.tgz#555bab2f8d11db74820ef0a2fbe2805b17c22587" integrity sha512-22OffREdHzD0U6A/W4RaFPV8NR73za6euibtAxNxO/fu5A6TwxRO2lAdbDWKJH9COv/vYs8zqfEiSalXH2nXJA== -"@keyv/serialize@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@keyv/serialize/-/serialize-1.0.3.tgz#e0fe3710e2a379cb0490cd41e5a5ffa2bab58bf6" - integrity sha512-qnEovoOp5Np2JDGonIDL6Ayihw0RhnRh6vxPuHo4RDn1UOzwEo4AeIfpL6UGIrsceWrCMiVPgwRjbHu4vYFc3g== +"@keyv/bigmap@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@keyv/bigmap/-/bigmap-1.0.2.tgz#9480d168c99a4a6c2fd3b677387cd922aa82a470" + integrity sha512-KR03xkEZlAZNF4IxXgVXb+uNIVNvwdh8UwI0cnc7WI6a+aQcDp8GL80qVfeB4E5NpsKJzou5jU0r6yLSSbMOtA== dependencies: - buffer "^6.0.3" + hookified "^1.12.1" + +"@keyv/serialize@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@keyv/serialize/-/serialize-1.1.1.tgz#0c01dd3a3483882af7cf3878d4e71d505c81fc4a" + integrity sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA== "@mswjs/interceptors@^0.39.1": version "0.39.2" @@ -2873,14 +2911,6 @@ buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" -buffer@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - bytes@3.1.2, bytes@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" @@ -2891,13 +2921,16 @@ cac@^6.7.14: resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== -cacheable@^1.8.9: - version "1.8.9" - resolved "https://registry.yarnpkg.com/cacheable/-/cacheable-1.8.9.tgz#f5498999567ae1015761d805bd8bbecd8393fbd4" - integrity sha512-FicwAUyWnrtnd4QqYAoRlNs44/a1jTL7XDKqm5gJ90wz1DQPlC7U2Rd1Tydpv+E7WAr4sQHuw8Q8M3nZMAyecQ== +cacheable@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/cacheable/-/cacheable-2.0.3.tgz#27d490121907166b152cda2d31fdafd41611365e" + integrity sha512-nZF80J3d8RMrroMSYm1E9pBllVDXWPuECZgEZxH+vusCY4MAXAJVrY0jutcHSgh3xYX3G2EUNnmtWGZVVjWCXw== dependencies: - hookified "^1.7.1" - keyv "^5.3.1" + "@cacheable/memoize" "^2.0.3" + "@cacheable/memory" "^2.0.3" + "@cacheable/utils" "^2.0.3" + hookified "^1.12.1" + keyv "^5.5.3" call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2: version "1.0.2" @@ -3379,7 +3412,7 @@ data-view-byte-offset@^1.0.1: es-errors "^1.3.0" is-data-view "^1.0.1" -debug@4, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@^4.3.6, debug@^4.3.7, debug@^4.4.0: +debug@4, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@^4.3.6, debug@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== @@ -3414,6 +3447,13 @@ debug@^4.1.0, debug@^4.3.1, debug@^4.4.1: dependencies: ms "^2.1.3" +debug@^4.4.3: + version "4.4.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== + dependencies: + ms "^2.1.3" + decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -4353,12 +4393,12 @@ fflate@^0.8.2: resolved "https://registry.yarnpkg.com/fflate/-/fflate-0.8.2.tgz#fc8631f5347812ad6028bbe4a2308b2792aa1dea" integrity sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A== -file-entry-cache@^10.0.8: - version "10.0.8" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-10.0.8.tgz#2b7a32c40615c4a6b59c385fb059a2762faf9624" - integrity sha512-FGXHpfmI4XyzbLd3HQ8cbUcsFGohJpZtmQRHr8z8FxxtCe2PcpgIlVLwIgunqjvRmXypBETvwhV4ptJizA+Y1Q== +file-entry-cache@^10.1.4: + version "10.1.4" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-10.1.4.tgz#1e81441517dc33ba5fe14421d96dc5fe7e37e820" + integrity sha512-5XRUFc0WTtUbjfGzEwXc42tiGxQHBmtbUG1h9L2apu4SulCGN3Hqm//9D6FAolf8MYNL7f/YlJl9vy08pj5JuA== dependencies: - flat-cache "^6.1.8" + flat-cache "^6.1.13" file-entry-cache@^8.0.0: version "8.0.0" @@ -4433,14 +4473,14 @@ flat-cache@^4.0.0: flatted "^3.2.9" keyv "^4.5.4" -flat-cache@^6.1.8: - version "6.1.8" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-6.1.8.tgz#968fb89b19df488fe60f346857ffc54b8dd0ba14" - integrity sha512-R6MaD3nrJAtO7C3QOuS79ficm2pEAy++TgEUD8ii1LVlbcgZ9DtASLkt9B+RZSFCzm7QHDMlXPsqqB6W2Pfr1Q== +flat-cache@^6.1.13: + version "6.1.17" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-6.1.17.tgz#31eb0de23c6a301c1420596d0089dd431649006d" + integrity sha512-Jzse4YoiUJBVYTwz5Bwl4h/2VQM7e2KK3MVAMlXzX9uamIHAH/TXUlRKU1AQGQOryQhN0EsmufiiF40G057YXA== dependencies: - cacheable "^1.8.9" + cacheable "^2.0.3" flatted "^3.3.3" - hookified "^1.8.1" + hookified "^1.12.0" flat@^5.0.2: version "5.0.2" @@ -4813,15 +4853,10 @@ hookable@^5.5.3: resolved "https://registry.yarnpkg.com/hookable/-/hookable-5.5.3.tgz#6cfc358984a1ef991e2518cb9ed4a778bbd3215d" integrity sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ== -hookified@^1.7.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/hookified/-/hookified-1.8.1.tgz#74a8c97d36e5f8004d230ee2156a607cc84c358c" - integrity sha512-GrO2l93P8xCWBSTBX9l2BxI78VU/MAAYag+pG8curS3aBGy0++ZlxrQ7PdUOUVMbn5BwkGb6+eRrnf43ipnFEA== - -hookified@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/hookified/-/hookified-1.8.2.tgz#b365a89dfce3da43e790673a6a97d3b896ae5fa7" - integrity sha512-5nZbBNP44sFCDjSoB//0N7m508APCgbQ4mGGo1KJGBYyCKNHfry1Pvd0JVHZIxjdnqn8nFRBAN/eFB6Rk/4w5w== +hookified@^1.12.0, hookified@^1.12.1: + version "1.12.1" + resolved "https://registry.yarnpkg.com/hookified/-/hookified-1.12.1.tgz#b0de0116ca346fd6c4e55db901f52d5cd728ef00" + integrity sha512-xnKGl+iMIlhrZmGHB729MqlmPoWBznctSQTYCpFKqNsCgimJQmithcW0xSQMMFzYnV2iKUh25alswn6epgxS0Q== html-encoding-sniffer@^4.0.0: version "4.0.0" @@ -4905,7 +4940,7 @@ iconv-lite@0.6.3, iconv-lite@^0.6.3: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" -ieee754@^1.1.13, ieee754@^1.2.1: +ieee754@^1.1.13: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== @@ -4915,10 +4950,10 @@ ignore@^5.2.0, ignore@^5.3.2: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== -ignore@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.3.tgz#397ef9315dfe0595671eefe8b633fec6943ab733" - integrity sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA== +ignore@^7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.5.tgz#4cb5f6cd7d4c7ab0365738c7aea888baa6d7efd9" + integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg== immediate@~3.0.5: version "3.0.6" @@ -5446,12 +5481,12 @@ keyv@^4.5.4: dependencies: json-buffer "3.0.1" -keyv@^5.3.1: - version "5.3.2" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-5.3.2.tgz#32edd461b51d44d42926eb72946236d79c71ae78" - integrity sha512-Lji2XRxqqa5Wg+CHLVfFKBImfJZ4pCSccu9eVWK6w4c2SDFLd8JAn1zqTuSFnsxb7ope6rMsnIHfp+eBbRBRZQ== +keyv@^5.5.3: + version "5.5.3" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-5.5.3.tgz#db7b7f89b3e13ade5a8d0fe59d765aebb596e84b" + integrity sha512-h0Un1ieD+HUrzBH6dJXhod3ifSghk5Hw/2Y4/KHBziPlZecrFyE9YOTPU6eOs0V9pYl8gOs86fkr/KN8lUX39A== dependencies: - "@keyv/serialize" "^1.0.3" + "@keyv/serialize" "^1.1.1" kind-of@^6.0.2: version "6.0.3" @@ -5463,10 +5498,10 @@ known-css-properties@^0.35.0: resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.35.0.tgz#f6f8e40ab4e5700fa32f5b2ef5218a56bc853bd6" integrity sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A== -known-css-properties@^0.36.0: - version "0.36.0" - resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.36.0.tgz#5c4365f3c9549ca2e813d2e729e6c47ef6a6cb60" - integrity sha512-A+9jP+IUmuQsNdsLdcg6Yt7voiMF/D4K83ew0OpJtpu+l34ef7LaohWV0Rc6KNvzw6ZDizkqfyB5JznZnzuKQA== +known-css-properties@^0.37.0: + version "0.37.0" + resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.37.0.tgz#10ebe49b9dbb6638860ff8a002fb65a053f4aec5" + integrity sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ== lazystream@^1.0.0: version "1.0.1" @@ -7360,39 +7395,39 @@ stylelint-scss@^6.4.0: postcss-selector-parser "^7.1.0" postcss-value-parser "^4.2.0" -stylelint@16.19.1: - version "16.19.1" - resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-16.19.1.tgz#486b95fa7518a3077ee2802bc6dda2174bc097bb" - integrity sha512-C1SlPZNMKl+d/C867ZdCRthrS+6KuZ3AoGW113RZCOL0M8xOGpgx7G70wq7lFvqvm4dcfdGFVLB/mNaLFChRKw== +stylelint@16.25.0: + version "16.25.0" + resolved "https://registry.yarnpkg.com/stylelint/-/stylelint-16.25.0.tgz#c3d602974f2a18fa57fadc9f3f40129b098fe4dc" + integrity sha512-Li0avYWV4nfv1zPbdnxLYBGq4z8DVZxbRgx4Kn6V+Uftz1rMoF1qiEI3oL4kgWqyYgCgs7gT5maHNZ82Gk03vQ== dependencies: - "@csstools/css-parser-algorithms" "^3.0.4" - "@csstools/css-tokenizer" "^3.0.3" - "@csstools/media-query-list-parser" "^4.0.2" + "@csstools/css-parser-algorithms" "^3.0.5" + "@csstools/css-tokenizer" "^3.0.4" + "@csstools/media-query-list-parser" "^4.0.3" "@csstools/selector-specificity" "^5.0.0" - "@dual-bundle/import-meta-resolve" "^4.1.0" + "@dual-bundle/import-meta-resolve" "^4.2.1" balanced-match "^2.0.0" colord "^2.9.3" cosmiconfig "^9.0.0" css-functions-list "^3.2.3" css-tree "^3.1.0" - debug "^4.3.7" + debug "^4.4.3" fast-glob "^3.3.3" fastest-levenshtein "^1.0.16" - file-entry-cache "^10.0.8" + file-entry-cache "^10.1.4" global-modules "^2.0.0" globby "^11.1.0" globjoin "^0.1.4" html-tags "^3.3.1" - ignore "^7.0.3" + ignore "^7.0.5" imurmurhash "^0.1.4" is-plain-object "^5.0.0" - known-css-properties "^0.36.0" + known-css-properties "^0.37.0" mathml-tag-names "^2.1.3" meow "^13.2.0" micromatch "^4.0.8" normalize-path "^3.0.0" picocolors "^1.1.1" - postcss "^8.5.3" + postcss "^8.5.6" postcss-resolve-nested-selector "^0.1.6" postcss-safe-parser "^7.0.1" postcss-selector-parser "^7.1.0" From 00ba6b7c5dfee168aaf5cdb002870a188417c5b8 Mon Sep 17 00:00:00 2001 From: Pleroma User <66706-pleromian@users.noreply.git.pleroma.social> Date: Tue, 7 Oct 2025 06:48:17 +0000 Subject: [PATCH 07/38] Fix broken conversation --- changelog.d/broken.fix | 2 + src/components/status/status.js | 4 +- src/components/status/status.scss | 4 ++ src/components/status/status.vue | 52 +++++++++++-------- src/i18n/en.json | 2 + src/modules/statuses.js | 5 +- src/services/status_parser/status_parser.js | 2 +- .../user_highlighter/user_highlighter.js | 2 +- 8 files changed, 47 insertions(+), 26 deletions(-) create mode 100644 changelog.d/broken.fix diff --git a/changelog.d/broken.fix b/changelog.d/broken.fix new file mode 100644 index 000000000..7e58091b4 --- /dev/null +++ b/changelog.d/broken.fix @@ -0,0 +1,2 @@ +Fix display of the broken/deleted/banned users + diff --git a/src/components/status/status.js b/src/components/status/status.js index ba6fe1b68..eebae459b 100644 --- a/src/components/status/status.js +++ b/src/components/status/status.js @@ -452,7 +452,7 @@ const Status = { }, scrobblePresent () { if (this.mergedConfig.hideScrobbles) return false - if (!this.status.user.latestScrobble) return false + if (!this.status.user?.latestScrobble) return false const value = this.mergedConfig.hideScrobblesAfter.match(/\d+/gs)[0] const unit = this.mergedConfig.hideScrobblesAfter.match(/\D+/gs)[0] let multiplier = 60 * 1000 // minutes is smallest unit @@ -474,7 +474,7 @@ const Status = { return this.status.user.latestScrobble.artist }, scrobble () { - return this.status.user.latestScrobble + return this.status.user?.latestScrobble } }, methods: { diff --git a/src/components/status/status.scss b/src/components/status/status.scss index 511a74074..897730a07 100644 --- a/src/components/status/status.scss +++ b/src/components/status/status.scss @@ -108,6 +108,10 @@ overflow: hidden; text-overflow: ellipsis; flex: 1 1 0; + + &.unknown { + min-width: 8em; + } } .heading-left { diff --git a/src/components/status/status.vue b/src/components/status/status.vue index fbc455ee6..ffdefb24f 100644 --- a/src/components/status/status.vue +++ b/src/components/status/status.vue @@ -109,6 +109,7 @@ class="left-side" > @@ -120,10 +121,17 @@ class="post-avatar" :show-actor-type-indicator="showActorTypeIndicator" :compact="compact" - :user="status.user" + :user="status?.user" /> +

- + +

-

- {{ status.user.name }} -

-
-
-
-
-

{{ $t('settings.background') }}

- -

{{ $t('settings.set_new_background') }}

- -
- -
- - -
-
-

{{ $t('settings.scale_and_layout') }}

-
- {{ $t("settings.style.appearance_tab_note") }} -
-
    -
  • - - {{ $t('settings.text_size') }} - -
    - - - px - rem - -
    - - 14px - -
    -
    -
  • -
  • - - {{ $t('settings.emoji_size') }} - -
      -
    • - - {{ $t('settings.emoji_reactions_scale') }} - -
    • -
    -
  • -
  • - - {{ $t('settings.navbar_size') }} - -
  • -

    {{ $t('settings.style.interface_font_user_override') }}

    -
  • - -
  • -
  • - -
  • -
  • - -
  • -
  • - -
  • -

    {{ $t('settings.columns') }}

    -
  • - - {{ $t('settings.panel_header_size') }} - -
  • -
  • - - {{ $t('settings.right_sidebar') }} - -
  • -
  • - - {{ $t('settings.navbar_column_stretch') }} - -
  • -
  • - - {{ $t('settings.third_column_mode') }} - -
  • -
  • - {{ $t('settings.column_sizes') }} -
    - +
  • + - {{ $t('settings.column_sizes_' + column) }} - -
- -
  • - - {{ $t('settings.disable_sticky_headers') }} - -
  • -
  • - - {{ $t('settings.show_scrollbars') }} - -
  • -
  • - - {{ $t('settings.theme_editor_min_width') }} - -
  • - + {{ $t('settings.theme_debug') }} + + +
  • + + {{ $t('settings.force_theme_recompilation_debug') }} + +
  • + + -
    -

    {{ $t('settings.visual_tweaks') }}

    -
      -
    • - - {{ $t('settings.mobile_center_dialog') }} - -
    • -
    • - - {{ $t('settings.style.themes3.hacks.force_interface_roundness') }} - -
    • -
    • - - {{ $t('settings.style.themes3.hacks.underlay_overrides') }} - -
    • -
    • - - {{ $t('settings.hide_wallpaper') }} - -
    • -
    • - - {{ $t('settings.force_theme_recompilation_debug') }} - -
    • -
    • - - {{ $t('settings.theme_debug') }} - -
    • -
    -
    - + diff --git a/src/components/settings_modal/tabs/general_tab.js b/src/components/settings_modal/tabs/general_tab.js index ff6d0e477..b98b7195e 100644 --- a/src/components/settings_modal/tabs/general_tab.js +++ b/src/components/settings_modal/tabs/general_tab.js @@ -1,5 +1,7 @@ import { mapState } from 'vuex' +import TabSwitcher from 'src/components/tab_switcher/tab_switcher.jsx' + import BooleanSetting from '../helpers/boolean_setting.vue' import ChoiceSetting from '../helpers/choice_setting.vue' import ScopeSelector from 'src/components/scope_selector/scope_selector.vue' @@ -9,6 +11,7 @@ import UnitSetting from '../helpers/unit_setting.vue' import InterfaceLanguageSwitcher from 'src/components/interface_language_switcher/interface_language_switcher.vue' import Select from 'src/components/select/select.vue' import ProfileSettingIndicator from '../helpers/profile_setting_indicator.vue' +import FontControl from 'src/components/font_control/font_control.vue' import SharedComputedObject from '../helpers/shared_computed_object.js' @@ -16,11 +19,19 @@ import localeService from 'src/services/locale/locale.service.js' import { clearCache, cacheKey, emojiCacheKey } from 'src/services/sw/sw.js' import { library } from '@fortawesome/fontawesome-svg-core' import { - faGlobe + faGlobe, + faMessage, + faPenAlt, + faDatabase, + faSliders } from '@fortawesome/free-solid-svg-icons' library.add( - faGlobe + faGlobe, + faMessage, + faPenAlt, + faDatabase, + faSliders ) const GeneralTab = { @@ -80,7 +91,9 @@ const GeneralTab = { InterfaceLanguageSwitcher, ProfileSettingIndicator, ScopeSelector, - Select + Select, + TabSwitcher, + FontControl }, computed: { postFormats () { @@ -99,8 +112,6 @@ const GeneralTab = { this.$store.dispatch('setOption', { name: 'interfaceLanguage', value: val }) } }, - instanceShoutboxPresent () { return this.$store.state.instance.shoutAvailable }, - instanceSpecificPanelPresent () { return this.$store.state.instance.showInstanceSpecificPanel }, ...SharedComputedObject(), ...mapState({ blockExpirationSupported: state => state.instance.blockExpiration, @@ -137,6 +148,18 @@ const GeneralTab = { this.$store.commit('setCurrentUser', user) }) }, + updateFont (key, value) { + this.$store.dispatch('setOption', { + name: 'theme3hacks', + value: { + ...this.mergedConfig.theme3hacks, + fonts: { + ...this.mergedConfig.theme3hacks.fonts, + [key]: value + } + } + }) + }, } } diff --git a/src/components/settings_modal/tabs/general_tab.vue b/src/components/settings_modal/tabs/general_tab.vue index 49fc57c79..ce48d923d 100644 --- a/src/components/settings_modal/tabs/general_tab.vue +++ b/src/components/settings_modal/tabs/general_tab.vue @@ -1,8 +1,17 @@ diff --git a/src/components/status/status.vue b/src/components/status/status.vue index ffdefb24f..91caa6a8c 100644 --- a/src/components/status/status.vue +++ b/src/components/status/status.vue @@ -152,12 +152,11 @@ :at="false" > - {{ status.user.name }} + {{ status.user.name }} Date: Thu, 20 Nov 2025 01:24:38 +0200 Subject: [PATCH 22/38] remove side-tabs from tab-switcher, splitting functionality into separate component --- src/components/tab_switcher/tab_switcher.jsx | 14 +-- src/components/tab_switcher/tab_switcher.scss | 98 ------------------- 2 files changed, 2 insertions(+), 110 deletions(-) diff --git a/src/components/tab_switcher/tab_switcher.jsx b/src/components/tab_switcher/tab_switcher.jsx index 02a0b47c0..0c627356f 100644 --- a/src/components/tab_switcher/tab_switcher.jsx +++ b/src/components/tab_switcher/tab_switcher.jsx @@ -31,11 +31,6 @@ export default { type: Boolean, default: false }, - sideTabBar: { - required: false, - type: Boolean, - default: false - }, bodyScrollLock: { required: false, type: Boolean, @@ -157,26 +152,21 @@ export default { return (
    - { - this.sideTabBar - ?

    {props.label}

    - : '' - } {renderSlot}
    ) }) return ( -
    +
    {tabs}
    .contents { - flex: 1 1 auto; - } - - > .tabs { - flex: 0 0 auto; - overflow: hidden auto; - flex-direction: column; - - &::after, - &::before { - flex-shrink: 0; - flex-basis: 0.5em; - content: ""; - border-right: 1px solid; - border-right-color: var(--border); - } - - &::after { - flex-grow: 1; - } - - &::before { - flex-grow: 0; - } - - .tab-wrapper { - min-width: 10em; - display: flex; - flex-direction: column; - - @media all and (width <= 800px) { - min-width: 4em; - } - - &:not(.active)::after { - top: 0; - right: 0; - bottom: 0; - border-right: 1px solid; - border-right-color: var(--border); - } - - &::before { - flex: 0 0 6px; - content: ""; - border-right: 1px solid; - border-right-color: var(--border); - } - - &:last-child .tab { - margin-bottom: 0; - } - } - - .tab { - flex: 1; - box-sizing: content-box; - max-width: 9em; - min-width: 1px; - border-top-right-radius: 0; - border-bottom-right-radius: 0; - padding-left: 1em; - padding-right: calc(1em + 200px); - margin-right: -200px; - margin-left: 1em; - - &:not(.active) { - margin-top: 0; - margin-left: 1.5em; - } - - @media all and (width <= 800px) { - padding-left: 0.25em; - padding-right: calc(0.25em + 200px); - margin-right: calc(0.25em - 200px); - margin-left: 0.25em; - - &:not(.active) { - margin-top: 0; - margin-left: 0.5em; - } - - .text { - display: none; - } - } - } - } - } - .contents { flex: 1 0 auto; min-height: 0; From a96f5337775328f729caabf6fde3e8ea0f977c26 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Thu, 20 Nov 2025 02:07:00 +0200 Subject: [PATCH 23/38] vertical tab switcher initial implementation --- .../settings_modal_admin_content.js | 4 +- .../settings_modal_admin_content.vue | 4 +- .../settings_modal_user_content.js | 4 +- .../settings_modal_user_content.vue | 4 +- .../settings_modal/tabs/appearance_tab.js | 4 +- .../settings_modal/tabs/appearance_tab.vue | 4 +- .../settings_modal/tabs/general_tab.js | 4 +- .../settings_modal/tabs/general_tab.vue | 6 +- .../tab_switcher/vertical_tab_switcher.jsx | 166 ++++++++++++++++++ .../tab_switcher/vertical_tab_switcher.scss | 72 ++++++++ 10 files changed, 254 insertions(+), 18 deletions(-) create mode 100644 src/components/tab_switcher/vertical_tab_switcher.jsx create mode 100644 src/components/tab_switcher/vertical_tab_switcher.scss diff --git a/src/components/settings_modal/settings_modal_admin_content.js b/src/components/settings_modal/settings_modal_admin_content.js index 593318ec4..fa6b7f8ad 100644 --- a/src/components/settings_modal/settings_modal_admin_content.js +++ b/src/components/settings_modal/settings_modal_admin_content.js @@ -1,4 +1,4 @@ -import TabSwitcher from 'src/components/tab_switcher/tab_switcher.jsx' +import VerticalTabSwitcher from 'src/components/tab_switcher/vertical_tab_switcher.jsx' import InstanceTab from './admin_tabs/instance_tab.vue' import LimitsTab from './admin_tabs/limits_tab.vue' @@ -31,7 +31,7 @@ library.add( const SettingsModalAdminContent = { components: { - TabSwitcher, + VerticalTabSwitcher, InstanceTab, LimitsTab, diff --git a/src/components/settings_modal/settings_modal_admin_content.vue b/src/components/settings_modal/settings_modal_admin_content.vue index 39ef74f64..501a3acf6 100644 --- a/src/components/settings_modal/settings_modal_admin_content.vue +++ b/src/components/settings_modal/settings_modal_admin_content.vue @@ -1,5 +1,5 @@ diff --git a/src/components/settings_modal/settings_modal_user_content.js b/src/components/settings_modal/settings_modal_user_content.js index c46b477d8..ed39b30b2 100644 --- a/src/components/settings_modal/settings_modal_user_content.js +++ b/src/components/settings_modal/settings_modal_user_content.js @@ -1,4 +1,4 @@ -import TabSwitcher from 'src/components/tab_switcher/tab_switcher.jsx' +import VerticalTabSwitcher from 'src/components/tab_switcher/vertical_tab_switcher.jsx' import DataImportExportTab from './tabs/data_import_export_tab.vue' import MutesAndBlocksTab from './tabs/mutes_and_blocks_tab.vue' @@ -42,7 +42,7 @@ library.add( const SettingsModalContent = { components: { - TabSwitcher, + VerticalTabSwitcher, DataImportExportTab, MutesAndBlocksTab, diff --git a/src/components/settings_modal/settings_modal_user_content.vue b/src/components/settings_modal/settings_modal_user_content.vue index f9a1e99bc..6bf8dc5ee 100644 --- a/src/components/settings_modal/settings_modal_user_content.vue +++ b/src/components/settings_modal/settings_modal_user_content.vue @@ -1,5 +1,5 @@ diff --git a/src/components/settings_modal/tabs/appearance_tab.js b/src/components/settings_modal/tabs/appearance_tab.js index 56e3ea10c..2978142ef 100644 --- a/src/components/settings_modal/tabs/appearance_tab.js +++ b/src/components/settings_modal/tabs/appearance_tab.js @@ -1,4 +1,4 @@ -import TabSwitcher from 'src/components/tab_switcher/tab_switcher.jsx' +import VerticalTabSwitcher from 'src/components/tab_switcher/vertical_tab_switcher.jsx' import BooleanSetting from '../helpers/boolean_setting.vue' import ChoiceSetting from '../helpers/choice_setting.vue' @@ -97,7 +97,7 @@ const AppearanceTab = { FontControl, Preview, PaletteEditor, - TabSwitcher + VerticalTabSwitcher }, mounted () { useInterfaceStore().getThemeData() diff --git a/src/components/settings_modal/tabs/appearance_tab.vue b/src/components/settings_modal/tabs/appearance_tab.vue index 05517af0c..9d45c3c19 100644 --- a/src/components/settings_modal/tabs/appearance_tab.vue +++ b/src/components/settings_modal/tabs/appearance_tab.vue @@ -1,5 +1,5 @@ diff --git a/src/components/settings_modal/tabs/general_tab.js b/src/components/settings_modal/tabs/general_tab.js index b98b7195e..68dd31941 100644 --- a/src/components/settings_modal/tabs/general_tab.js +++ b/src/components/settings_modal/tabs/general_tab.js @@ -1,6 +1,6 @@ import { mapState } from 'vuex' -import TabSwitcher from 'src/components/tab_switcher/tab_switcher.jsx' +import VerticalTabSwitcher from 'src/components/tab_switcher/vertical_tab_switcher.jsx' import BooleanSetting from '../helpers/boolean_setting.vue' import ChoiceSetting from '../helpers/choice_setting.vue' @@ -92,7 +92,7 @@ const GeneralTab = { ProfileSettingIndicator, ScopeSelector, Select, - TabSwitcher, + VerticalTabSwitcher, FontControl }, computed: { diff --git a/src/components/settings_modal/tabs/general_tab.vue b/src/components/settings_modal/tabs/general_tab.vue index ce48d923d..3c16c5cdf 100644 --- a/src/components/settings_modal/tabs/general_tab.vue +++ b/src/components/settings_modal/tabs/general_tab.vue @@ -1,10 +1,8 @@ diff --git a/src/components/tab_switcher/vertical_tab_switcher.jsx b/src/components/tab_switcher/vertical_tab_switcher.jsx new file mode 100644 index 000000000..7182c944d --- /dev/null +++ b/src/components/tab_switcher/vertical_tab_switcher.jsx @@ -0,0 +1,166 @@ +// eslint-disable-next-line no-unused +import { h, Fragment } from 'vue' +import { mapState } from 'pinia' +import { throttle } from 'lodash' +import { mapState as mapPiniaState } from 'pinia' +import { FontAwesomeIcon as FAIcon } from '@fortawesome/vue-fontawesome' + +import './vertical_tab_switcher.scss' +import { useInterfaceStore } from 'src/stores/interface' + +const findFirstUsable = (slots) => slots.findIndex(_ => _.props) + +export default { + name: 'VerticalTabSwitcher', + props: { + renderOnlyFocused: { + required: false, + type: Boolean, + default: false + }, + onSwitch: { + required: false, + type: Function, + default: undefined + }, + activeTab: { + required: false, + type: String, + default: undefined + }, + bodyScrollLock: { + required: false, + type: Boolean, + default: false + } + }, + data () { + return { + active: findFirstUsable(this.slots()), + resizeHandler: null + } + }, + computed: { + activeIndex () { + // In case of controlled component + if (this.activeTab) { + return this.slots().findIndex(slot => slot && slot.props && this.activeTab === slot.props.key) + } else { + return this.active + } + }, + isActive () { + return tabName => { + const isWanted = slot => slot.props && slot.props['data-tab-name'] === tabName + return this.$slots.default().findIndex(isWanted) === this.activeIndex + } + }, + ...mapPiniaState(useInterfaceStore, { + mobileLayout: store => store.layoutType === 'mobile' + }), + }, + beforeUpdate () { + const currentSlot = this.slots()[this.active] + if (!currentSlot.props) { + this.active = findFirstUsable(this.slots()) + } + }, + methods: { + clickTab (index) { + return (e) => { + e.preventDefault() + this.setTab(index) + console.log(index) + } + }, + // DO NOT put it to computed, it doesn't work (caching?) + slots () { + if (this.$slots.default()[0].type === Fragment) { + return this.$slots.default()[0].children + } + return this.$slots.default() + }, + setTab (index) { + if (typeof this.onSwitch === 'function') { + this.onSwitch.call(null, this.slots()[index].key) + } + this.active = index + this.$refs.contents.scrollTop = 0 + } + }, + render () { + const tabs = this.slots() + .map((slot, index) => { + const props = slot.props + if (!props) return + const classesTab = ['vertical-tab menu-item'] + if (this.activeIndex === index) { + classesTab.push('-active') + } + return ( + + ) + }) + + const contents = this.slots().map((slot, index) => { + const props = slot.props + if (!props) return + const active = this.activeIndex === index + const classes = [ active ? 'active' : 'hidden' ] + if (props.fullHeight) { + classes.push('full-height') + } + let delayRender = slot.props['delay-render'] + if (delayRender && active) { + slot.props['delay-render'] = false + delayRender = false + } + const renderSlot = (!delayRender && (!this.renderOnlyFocused || active)) + ? slot + : '' + + const header = ( +

    + {props.label} +

    + ) + + return ( +
    + {header} + {renderSlot} +
    + ) + }) + + return ( +
    +
    + {tabs} +
    +
    + {contents} +
    +
    + ) + } +} diff --git a/src/components/tab_switcher/vertical_tab_switcher.scss b/src/components/tab_switcher/vertical_tab_switcher.scss new file mode 100644 index 000000000..c5454d52d --- /dev/null +++ b/src/components/tab_switcher/vertical_tab_switcher.scss @@ -0,0 +1,72 @@ +.vertical-tab-switcher { + display: flex; + flex-direction: row; + + > .tabs { + flex: 0 0 auto; + overflow: hidden auto; + flex-direction: column; + border-right: 1px solid; + border-right-color: var(--border); + min-width: 10em; + + > .menu-item { + padding: 0.5em 1em; + + .tab-icon { + vertical-align: middle; + margin-right: 0.75em; + } + } + } + + > .contents { + flex: 1 0 auto; + + .hidden { + display: none; + } + + .full-height:not(.hidden) { + height: 100%; + display: flex; + flex-direction: column; + + > *:not(.tab-content-label) { + flex: 1; + } + } + + .tab-content-label { + font-size: 1.5em; + padding: 0.5em 1em; + margin: 0; + border-bottom: 1px solid var(--border); + } + } + + > .tabs, + > .content { + transition: width 2s ease-in; + } + + &.-tabs { + > .tabs { + width: 100%; + } + + > .content { + width: 0%; + } + } + + &.-content { + > .tabs { + width: 0%; + } + + > .content { + width: 100%; + } + } +} From 5958c32acf2c79f2d7380a6f82556d43a426f088 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Thu, 20 Nov 2025 08:07:51 +0200 Subject: [PATCH 24/38] fix turd that kept breaking UI on hot reload --- src/components/popover/popover.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/popover/popover.js b/src/components/popover/popover.js index d2e605adb..e8e857918 100644 --- a/src/components/popover/popover.js +++ b/src/components/popover/popover.js @@ -299,8 +299,8 @@ const Popover = { if (this.trigger === 'click') { document.removeEventListener('click', this.onClickOutside) } - this.scrollable.removeEventListener('scroll', this.onScroll) - this.scrollable.removeEventListener('resize', this.onResize) + this.scrollable?.removeEventListener('scroll', this.onScroll) + this.scrollable?.removeEventListener('resize', this.onResize) }, resizePopover () { setTimeout(() => { From e6f025bf6ef3d8e712e7d38115836ad1c5d29bcb Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Thu, 20 Nov 2025 12:12:14 +0200 Subject: [PATCH 25/38] after 9000 hours it finally works --- .../settings_modal_user_content.js | 6 ++ .../settings_modal_user_content.vue | 15 +++- .../settings_modal/tabs/appearance_tab.vue | 2 + .../settings_modal/tabs/general_tab.vue | 2 + src/components/tab_switcher/tab_switcher.jsx | 6 +- .../tab_switcher/vertical_tab_switcher.jsx | 60 ++++++++++--- .../tab_switcher/vertical_tab_switcher.scss | 89 +++++++++++-------- 7 files changed, 131 insertions(+), 49 deletions(-) diff --git a/src/components/settings_modal/settings_modal_user_content.js b/src/components/settings_modal/settings_modal_user_content.js index ed39b30b2..5827c8fb3 100644 --- a/src/components/settings_modal/settings_modal_user_content.js +++ b/src/components/settings_modal/settings_modal_user_content.js @@ -88,6 +88,12 @@ const SettingsModalContent = { // Clear the state of target tab, so that next time settings is opened // it doesn't force it. useInterfaceStore().clearSettingsModalTargetTab() + }, + nestedTooBig () { + this.$refs.tabSwitcher.showNav() + }, + nestedTooSmall () { + this.$refs.tabSwitcher.hideNav() } }, mounted () { diff --git a/src/components/settings_modal/settings_modal_user_content.vue b/src/components/settings_modal/settings_modal_user_content.vue index 6bf8dc5ee..8771cb5cf 100644 --- a/src/components/settings_modal/settings_modal_user_content.vue +++ b/src/components/settings_modal/settings_modal_user_content.vue @@ -2,24 +2,33 @@
    - +
    - +
    +
    {contents}
    diff --git a/src/components/tab_switcher/vertical_tab_switcher.jsx b/src/components/tab_switcher/vertical_tab_switcher.jsx index 7182c944d..d28d6d75a 100644 --- a/src/components/tab_switcher/vertical_tab_switcher.jsx +++ b/src/components/tab_switcher/vertical_tab_switcher.jsx @@ -34,10 +34,12 @@ export default { default: false } }, + emits: ['tooBig', 'tooSmall'], data () { return { active: findFirstUsable(this.slots()), - resizeHandler: null + resizeHandler: null, + navMode: false } }, computed: { @@ -59,6 +61,16 @@ export default { mobileLayout: store => store.layoutType === 'mobile' }), }, + created () { + this.resizeHandler = throttle(this.onResize, 200) + window.addEventListener('resize', this.resizeHandler) + }, + mounted () { + this.resizeHandler() + }, + unmounted () { + window.removeEventListener('resize', this.resizeHandler) + }, beforeUpdate () { const currentSlot = this.slots()[this.active] if (!currentSlot.props) { @@ -70,7 +82,20 @@ export default { return (e) => { e.preventDefault() this.setTab(index) - console.log(index) + } + }, + onResize (index) { + const tabContent = this.$refs.contents?.querySelector('.tab-content-wrapper.-active .tab-content') + const tabContentWidth = tabContent.clientWidth + const rootWidth = this.$refs.root?.clientWidth + const navWidth = this.$refs.nav?.clientWidth + const contentsWidth = this.$refs.contents?.clientWidth + + + if (contentsWidth < tabContentWidth) { + this.$emit('tooSmall') + } else if (contentsWidth - navWidth >= tabContentWidth){ + this.$emit('tooBig') } }, // DO NOT put it to computed, it doesn't work (caching?) @@ -85,7 +110,12 @@ export default { this.onSwitch.call(null, this.slots()[index].key) } this.active = index - this.$refs.contents.scrollTop = 0 + }, + showNav () { + this.navMode = false + }, + hideNav () { + this.navMode = true } }, render () { @@ -93,7 +123,7 @@ export default { .map((slot, index) => { const props = slot.props if (!props) return - const classesTab = ['vertical-tab menu-item'] + const classesTab = ['vertical-tab', 'menu-item'] if (this.activeIndex === index) { classesTab.push('-active') } @@ -104,6 +134,7 @@ export default { class={classesTab.join(' ')} type="button" role="tab" + title={props.label} > {!props.icon ? '' : ()} @@ -117,9 +148,9 @@ export default { const props = slot.props if (!props) return const active = this.activeIndex === index - const classes = [ active ? 'active' : 'hidden' ] + const classes = ['tab-content-wrapper', active ? '-active' : '-hidden' ] if (props.fullHeight) { - classes.push('full-height') + classes.push('-full-height') } let delayRender = slot.props['delay-render'] if (delayRender && active) { @@ -137,17 +168,25 @@ export default { ) return ( -
    +
    {header} - {renderSlot} +
    + {renderSlot} +
    ) }) + const rootClasses = ['vertical-tab-switcher'] + if (this.navMode) { + rootClasses.push('-nav-mode') + rootClasses.push('-nav-content') + } + return ( -
    +
    @@ -157,6 +196,7 @@ export default { role="tabpanel" class={'contents' + (this.scrollableTabs ? ' scrollable-tabs' : '')} v-body-scroll-lock={this.bodyScrollLock} + ref="contents" > {contents}
    diff --git a/src/components/tab_switcher/vertical_tab_switcher.scss b/src/components/tab_switcher/vertical_tab_switcher.scss index c5454d52d..7dd0c473f 100644 --- a/src/components/tab_switcher/vertical_tab_switcher.scss +++ b/src/components/tab_switcher/vertical_tab_switcher.scss @@ -4,11 +4,13 @@ > .tabs { flex: 0 0 auto; - overflow: hidden auto; flex-direction: column; + overflow: hidden auto; + white-space: nowrap; + text-overflow: ellipsis; + width: 15em; border-right: 1px solid; border-right-color: var(--border); - min-width: 10em; > .menu-item { padding: 0.5em 1em; @@ -21,52 +23,69 @@ } > .contents { - flex: 1 0 auto; + flex: 1 1 auto; + overflow-x: hidden; - .hidden { - display: none; - } + .tab-content { + align-self: center; - .full-height:not(.hidden) { - height: 100%; - display: flex; - flex-direction: column; + &:not(.-full-width) { + width: 30em; + } - > *:not(.tab-content-label) { - flex: 1; + &.-full-width { + align-self: stretch; } } - .tab-content-label { - font-size: 1.5em; - padding: 0.5em 1em; - margin: 0; - border-bottom: 1px solid var(--border); + .tab-content-wrapper { + display: flex; + flex-direction: column; + + .tab-content-label { + font-size: 1.5em; + padding: 0.5em 1em; + margin: 0; + border-bottom: 1px solid var(--border); + } + + &.-hidden { + display: none; + } + + &.-full-height:not(.-hidden) { + height: 100%; + display: flex; + flex-direction: column; + + > *:not(.tab-content-label) { + flex: 1; + } + } } } - > .tabs, - > .content { - transition: width 2s ease-in; - } + &.-nav-mode { + &.-nav-tabs { + > .tabs { + width: 100%; + } - &.-tabs { - > .tabs { - width: 100%; + > .nav-content { + width: 0%; + } } - > .content { - width: 0%; - } - } + &.-nav-content { + > .tabs { + position: absolute; + pointer-events: none; + opacity: 0; + } - &.-content { - > .tabs { - width: 0%; - } - - > .content { - width: 100%; + > .nav-content { + width: 100%; + } } } } From 8e6800fd1ece29964d5287620c441eb9e86f7cd2 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Thu, 20 Nov 2025 18:29:09 +0200 Subject: [PATCH 26/38] level 2 collapse --- .../settings_modal_user_content.js | 7 +++++++ .../settings_modal_user_content.vue | 1 + .../settings_modal/tabs/general_tab.js | 6 ++++++ .../settings_modal/tabs/general_tab.vue | 1 + .../tab_switcher/vertical_tab_switcher.jsx | 18 +++++++++++++++--- .../tab_switcher/vertical_tab_switcher.scss | 12 ++++++++++++ 6 files changed, 42 insertions(+), 3 deletions(-) diff --git a/src/components/settings_modal/settings_modal_user_content.js b/src/components/settings_modal/settings_modal_user_content.js index 5827c8fb3..c770fbe04 100644 --- a/src/components/settings_modal/settings_modal_user_content.js +++ b/src/components/settings_modal/settings_modal_user_content.js @@ -73,6 +73,11 @@ const SettingsModalContent = { return useInterfaceStore().layoutType === 'mobile' } }, + data () { + return { + navCollapsed: false + } + }, methods: { onOpen () { const targetTab = useInterfaceStore().settingsModalTargetTab @@ -90,9 +95,11 @@ const SettingsModalContent = { useInterfaceStore().clearSettingsModalTargetTab() }, nestedTooBig () { + this.navCollapsed = false this.$refs.tabSwitcher.showNav() }, nestedTooSmall () { + this.navCollapsed = true this.$refs.tabSwitcher.hideNav() } }, diff --git a/src/components/settings_modal/settings_modal_user_content.vue b/src/components/settings_modal/settings_modal_user_content.vue index 8771cb5cf..de89cecc8 100644 --- a/src/components/settings_modal/settings_modal_user_content.vue +++ b/src/components/settings_modal/settings_modal_user_content.vue @@ -13,6 +13,7 @@ > diff --git a/src/components/settings_modal/tabs/general_tab.js b/src/components/settings_modal/tabs/general_tab.js index 68dd31941..28a4eac40 100644 --- a/src/components/settings_modal/tabs/general_tab.js +++ b/src/components/settings_modal/tabs/general_tab.js @@ -35,6 +35,12 @@ library.add( ) const GeneralTab = { + props: { + parentCollapsed: { + required: true, + type: Boolean + } + }, data () { return { subjectLineOptions: ['email', 'noop', 'masto'].map(mode => ({ diff --git a/src/components/settings_modal/tabs/general_tab.vue b/src/components/settings_modal/tabs/general_tab.vue index 9ea0fb89c..de88add2d 100644 --- a/src/components/settings_modal/tabs/general_tab.vue +++ b/src/components/settings_modal/tabs/general_tab.vue @@ -3,6 +3,7 @@ :label="$t('settings.general')" ref="tabSwitcher" class="settings_tab-switcher" + :parent-collapsed="parentCollapsed" @too-small="() => $emit('tooSmall')" @too-big="() => $emit('tooBig')" > diff --git a/src/components/tab_switcher/vertical_tab_switcher.jsx b/src/components/tab_switcher/vertical_tab_switcher.jsx index d28d6d75a..45e502f4c 100644 --- a/src/components/tab_switcher/vertical_tab_switcher.jsx +++ b/src/components/tab_switcher/vertical_tab_switcher.jsx @@ -32,6 +32,11 @@ export default { required: false, type: Boolean, default: false + }, + parentCollapsed: { + required: false, + type: Boolean, + default: false } }, emits: ['tooBig', 'tooSmall'], @@ -91,11 +96,18 @@ export default { const navWidth = this.$refs.nav?.clientWidth const contentsWidth = this.$refs.contents?.clientWidth - if (contentsWidth < tabContentWidth) { - this.$emit('tooSmall') + if (this.parentCollapsed) { + this.hideNav() + } else { + this.$emit('tooSmall') + } } else if (contentsWidth - navWidth >= tabContentWidth){ - this.$emit('tooBig') + if (this.parentCollapsed) { + this.$emit('tooBig') + } else { + this.showNav() + } } }, // DO NOT put it to computed, it doesn't work (caching?) diff --git a/src/components/tab_switcher/vertical_tab_switcher.scss b/src/components/tab_switcher/vertical_tab_switcher.scss index 7dd0c473f..480f90f1a 100644 --- a/src/components/tab_switcher/vertical_tab_switcher.scss +++ b/src/components/tab_switcher/vertical_tab_switcher.scss @@ -26,6 +26,10 @@ flex: 1 1 auto; overflow-x: hidden; + .tab-content-label { + display: none + } + .tab-content { align-self: center; @@ -77,6 +81,14 @@ } &.-nav-content { + > .contents { + > .tab-content-wrapper { + > .tab-content-label { + display: block; + } + } + } + > .tabs { position: absolute; pointer-events: none; From 7d1799e9299ebd43d595fc8acdfc271679b9d265 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Thu, 20 Nov 2025 20:10:20 +0200 Subject: [PATCH 27/38] fix order of expansion, WIP hiding headers --- .../settings_modal_user_content.js | 7 ++++- .../settings_modal_user_content.vue | 3 +++ .../settings_modal/tabs/general_tab.js | 9 +++++++ .../settings_modal/tabs/general_tab.vue | 4 +-- .../tab_switcher/vertical_tab_switcher.jsx | 27 ++++++++++++++++--- .../tab_switcher/vertical_tab_switcher.scss | 4 +++ 6 files changed, 47 insertions(+), 7 deletions(-) diff --git a/src/components/settings_modal/settings_modal_user_content.js b/src/components/settings_modal/settings_modal_user_content.js index c770fbe04..7a05adbb1 100644 --- a/src/components/settings_modal/settings_modal_user_content.js +++ b/src/components/settings_modal/settings_modal_user_content.js @@ -75,7 +75,8 @@ const SettingsModalContent = { }, data () { return { - navCollapsed: false + navCollapsed: false, + childCollapsed: false } }, methods: { @@ -96,10 +97,14 @@ const SettingsModalContent = { }, nestedTooBig () { this.navCollapsed = false + this.childCollapsed = this.$refs.generalTab.getNavMode() + console.log(this.navCollapsed, this.childCollapsed) this.$refs.tabSwitcher.showNav() }, nestedTooSmall () { this.navCollapsed = true + this.childCollapsed = this.$refs.generalTab.getNavMode() + console.log(this.navCollapsed, this.childCollapsed) this.$refs.tabSwitcher.hideNav() } }, diff --git a/src/components/settings_modal/settings_modal_user_content.vue b/src/components/settings_modal/settings_modal_user_content.vue index de89cecc8..b992796ef 100644 --- a/src/components/settings_modal/settings_modal_user_content.vue +++ b/src/components/settings_modal/settings_modal_user_content.vue @@ -3,6 +3,7 @@ ref="tabSwitcher" class="settings_tab-switcher" :scrollable-tabs="true" + :child-collapsed="childCollapsed" :body-scroll-lock="bodyLock" >
    diff --git a/src/components/settings_modal/tabs/general_tab.js b/src/components/settings_modal/tabs/general_tab.js index 28a4eac40..897999bba 100644 --- a/src/components/settings_modal/tabs/general_tab.js +++ b/src/components/settings_modal/tabs/general_tab.js @@ -136,6 +136,15 @@ const GeneralTab = { this.$store.dispatch('settingsSaved', { error }) }) }, + tooSmall () { + this.$emit('tooSmall') + }, + tooBig () { + this.$emit('tooBig') + }, + getNavMode () { + return this.$refs.tabSwitcher.getNavMode() + }, clearAssetCache () { this.clearCache(cacheKey) }, diff --git a/src/components/settings_modal/tabs/general_tab.vue b/src/components/settings_modal/tabs/general_tab.vue index de88add2d..2476a8d28 100644 --- a/src/components/settings_modal/tabs/general_tab.vue +++ b/src/components/settings_modal/tabs/general_tab.vue @@ -4,8 +4,8 @@ ref="tabSwitcher" class="settings_tab-switcher" :parent-collapsed="parentCollapsed" - @too-small="() => $emit('tooSmall')" - @too-big="() => $emit('tooBig')" + @too-small="tooSmall" + @too-big="tooBig" >
    = tabContentWidth){ - if (this.parentCollapsed) { + if (!this.navMode) { this.$emit('tooBig') } else { this.showNav() @@ -122,12 +128,16 @@ export default { this.onSwitch.call(null, this.slots()[index].key) } this.active = index + this.navSide = 'content' }, showNav () { this.navMode = false }, hideNav () { this.navMode = true + }, + getNavMode () { + return this.navMode } }, render () { @@ -173,8 +183,13 @@ export default { ? slot : '' + const headerClasses = ['tab-content-label'] + if (this.childCollapsed) { + headerClasses.push('-hidden') + } const header = ( -

    +

    + {props.label}

    ) @@ -192,7 +207,11 @@ export default { const rootClasses = ['vertical-tab-switcher'] if (this.navMode) { rootClasses.push('-nav-mode') - rootClasses.push('-nav-content') + if (this.navSide === 'content') { + rootClasses.push('-nav-content') + } else { + rootClasses.push('-nav-tabs') + } } return ( diff --git a/src/components/tab_switcher/vertical_tab_switcher.scss b/src/components/tab_switcher/vertical_tab_switcher.scss index 480f90f1a..2a6e1cc6a 100644 --- a/src/components/tab_switcher/vertical_tab_switcher.scss +++ b/src/components/tab_switcher/vertical_tab_switcher.scss @@ -85,6 +85,10 @@ > .tab-content-wrapper { > .tab-content-label { display: block; + + &.-hidden { + display: none; + } } } } From 3f4ad3437763f8d1269ebefd46c7947e26cfbc89 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Thu, 20 Nov 2025 20:52:18 +0200 Subject: [PATCH 28/38] crappy implementation of hiding extra header --- .../tab_switcher/vertical_tab_switcher.jsx | 74 ++++++++++--------- 1 file changed, 40 insertions(+), 34 deletions(-) diff --git a/src/components/tab_switcher/vertical_tab_switcher.jsx b/src/components/tab_switcher/vertical_tab_switcher.jsx index 5b69580bc..be7c94a50 100644 --- a/src/components/tab_switcher/vertical_tab_switcher.jsx +++ b/src/components/tab_switcher/vertical_tab_switcher.jsx @@ -36,18 +36,14 @@ export default { parentCollapsed: { required: false, type: Boolean, - default: false - }, - childCollapsed: { - required: false, - type: Boolean, - default: false + default: null } }, emits: ['tooBig', 'tooSmall'], data () { return { active: findFirstUsable(this.slots()), + childCollapsed: null, resizeHandler: null, navMode: false, navSide: 'content' @@ -93,36 +89,9 @@ export default { return (e) => { e.preventDefault() this.setTab(index) + onResize() } }, - onResize (index) { - const tabContent = this.$refs.contents?.querySelector('.tab-content-wrapper.-active .tab-content') - const tabContentWidth = tabContent.clientWidth - const rootWidth = this.$refs.root?.clientWidth - const navWidth = this.$refs.nav?.clientWidth - const contentsWidth = this.$refs.contents?.clientWidth - - if (contentsWidth < tabContentWidth) { - if (this.parentCollapsed) { - this.hideNav() - } else { - this.$emit('tooSmall') - } - } else if (contentsWidth - navWidth >= tabContentWidth){ - if (!this.navMode) { - this.$emit('tooBig') - } else { - this.showNav() - } - } - }, - // DO NOT put it to computed, it doesn't work (caching?) - slots () { - if (this.$slots.default()[0].type === Fragment) { - return this.$slots.default()[0].children - } - return this.$slots.default() - }, setTab (index) { if (typeof this.onSwitch === 'function') { this.onSwitch.call(null, this.slots()[index].key) @@ -138,6 +107,43 @@ export default { }, getNavMode () { return this.navMode + }, + onResize () { + // All other tabs are hidden and their width is most likely 0 + const tabContent = this.$refs.contents?.querySelector('.tab-content-wrapper.-active .tab-content') + const tabContentWidth = tabContent.clientWidth + const navWidth = this.$refs.nav?.clientWidth + const contentsWidth = this.$refs.contents?.clientWidth + + const nestedSwitcher = this.$refs.contents?.querySelector('.vertical-tab-switcher') + if (nestedSwitcher) { + const childHeader = nestedSwitcher.querySelector('.tab-content-label') + this.childCollapsed = childHeader?.checkVisibility() + } + // if contents takes more space than its container + if (contentsWidth < tabContentWidth) { + if (this.parentCollapsed) { + this.hideNav() + } else { + this.$emit('tooSmall') + } + // If we (theoretically) have enough space to fit it in + } else if (contentsWidth - navWidth >= tabContentWidth){ + // First expand the inner layer, then outer + // if use same logic as above order will be reversed + if (!this.navMode) { + this.$emit('tooBig') + } else { + this.showNav() + } + } + }, + // DO NOT put it to computed, it doesn't work (caching?) + slots () { + if (this.$slots.default()[0].type === Fragment) { + return this.$slots.default()[0].children + } + return this.$slots.default() } }, render () { From 8b8af2889b541dcc7a18d085113eaf58e8de6595 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Thu, 20 Nov 2025 21:17:44 +0200 Subject: [PATCH 29/38] better impl of header hiding? --- .../settings_modal_user_content.js | 10 +++---- .../settings_modal_user_content.vue | 2 ++ .../tab_switcher/vertical_tab_switcher.jsx | 26 +++++++++++-------- 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/src/components/settings_modal/settings_modal_user_content.js b/src/components/settings_modal/settings_modal_user_content.js index 7a05adbb1..4f6ffe4fb 100644 --- a/src/components/settings_modal/settings_modal_user_content.js +++ b/src/components/settings_modal/settings_modal_user_content.js @@ -76,7 +76,7 @@ const SettingsModalContent = { data () { return { navCollapsed: false, - childCollapsed: false + navHideHeader: false } }, methods: { @@ -97,15 +97,15 @@ const SettingsModalContent = { }, nestedTooBig () { this.navCollapsed = false - this.childCollapsed = this.$refs.generalTab.getNavMode() - console.log(this.navCollapsed, this.childCollapsed) this.$refs.tabSwitcher.showNav() }, nestedTooSmall () { this.navCollapsed = true - this.childCollapsed = this.$refs.generalTab.getNavMode() - console.log(this.navCollapsed, this.childCollapsed) this.$refs.tabSwitcher.hideNav() + }, + nestedNavSide (side) { + console.log('SWITCH') + this.navHideHeader = side === 'content' } }, mounted () { diff --git a/src/components/settings_modal/settings_modal_user_content.vue b/src/components/settings_modal/settings_modal_user_content.vue index b992796ef..22271d533 100644 --- a/src/components/settings_modal/settings_modal_user_content.vue +++ b/src/components/settings_modal/settings_modal_user_content.vue @@ -5,6 +5,7 @@ :scrollable-tabs="true" :child-collapsed="childCollapsed" :body-scroll-lock="bodyLock" + :hide-header="navHideHeader" >
    diff --git a/src/components/tab_switcher/vertical_tab_switcher.jsx b/src/components/tab_switcher/vertical_tab_switcher.jsx index be7c94a50..bb3fb7305 100644 --- a/src/components/tab_switcher/vertical_tab_switcher.jsx +++ b/src/components/tab_switcher/vertical_tab_switcher.jsx @@ -37,13 +37,17 @@ export default { required: false, type: Boolean, default: null + }, + hideHeader: { + required: false, + type: Boolean, + default: null } }, - emits: ['tooBig', 'tooSmall'], + emits: ['tooBig', 'tooSmall', 'sideSwitch'], data () { return { active: findFirstUsable(this.slots()), - childCollapsed: null, resizeHandler: null, navMode: false, navSide: 'content' @@ -89,7 +93,7 @@ export default { return (e) => { e.preventDefault() this.setTab(index) - onResize() + this.onResize() } }, setTab (index) { @@ -97,7 +101,7 @@ export default { this.onSwitch.call(null, this.slots()[index].key) } this.active = index - this.navSide = 'content' + this.changeNavSide('content') }, showNav () { this.navMode = false @@ -105,6 +109,10 @@ export default { hideNav () { this.navMode = true }, + changeNavSide (side) { + this.navSide = side + this.$emit('sideSwitch', side) + }, getNavMode () { return this.navMode }, @@ -115,11 +123,6 @@ export default { const navWidth = this.$refs.nav?.clientWidth const contentsWidth = this.$refs.contents?.clientWidth - const nestedSwitcher = this.$refs.contents?.querySelector('.vertical-tab-switcher') - if (nestedSwitcher) { - const childHeader = nestedSwitcher.querySelector('.tab-content-label') - this.childCollapsed = childHeader?.checkVisibility() - } // if contents takes more space than its container if (contentsWidth < tabContentWidth) { if (this.parentCollapsed) { @@ -190,12 +193,13 @@ export default { : '' const headerClasses = ['tab-content-label'] - if (this.childCollapsed) { + console.log(this.hideHeader) + if (this.hideHeader) { headerClasses.push('-hidden') } const header = (

    - + {props.label}

    ) From 63535b1494297d615e21fc9c240047553a5910f9 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Thu, 20 Nov 2025 21:54:52 +0200 Subject: [PATCH 30/38] less spam of events, fix nesting headers (again) --- .../settings_modal_user_content.js | 13 +++++---- .../tab_switcher/vertical_tab_switcher.jsx | 29 +++++++++++++------ 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/src/components/settings_modal/settings_modal_user_content.js b/src/components/settings_modal/settings_modal_user_content.js index 4f6ffe4fb..55f2a9ce9 100644 --- a/src/components/settings_modal/settings_modal_user_content.js +++ b/src/components/settings_modal/settings_modal_user_content.js @@ -96,15 +96,18 @@ const SettingsModalContent = { useInterfaceStore().clearSettingsModalTargetTab() }, nestedTooBig () { - this.navCollapsed = false - this.$refs.tabSwitcher.showNav() + if (this.navCollapsed) { + this.navCollapsed = false + this.$refs.tabSwitcher.showNav() + } }, nestedTooSmall () { - this.navCollapsed = true - this.$refs.tabSwitcher.hideNav() + if (!this.navCollapsed) { + this.navCollapsed = true + this.$refs.tabSwitcher.hideNav() + } }, nestedNavSide (side) { - console.log('SWITCH') this.navHideHeader = side === 'content' } }, diff --git a/src/components/tab_switcher/vertical_tab_switcher.jsx b/src/components/tab_switcher/vertical_tab_switcher.jsx index bb3fb7305..9341b2d77 100644 --- a/src/components/tab_switcher/vertical_tab_switcher.jsx +++ b/src/components/tab_switcher/vertical_tab_switcher.jsx @@ -104,24 +104,35 @@ export default { this.changeNavSide('content') }, showNav () { - this.navMode = false + if (this.navMode) { + this.navMode = false + this.changeNavSide(null) + this.onResize() + } }, hideNav () { - this.navMode = true + if (!this.navMode) { + this.navMode = true + this.changeNavSide('content') + this.onResize() + } }, changeNavSide (side) { - this.navSide = side - this.$emit('sideSwitch', side) + if (this.navSide !== side) { + this.navSide = side + this.$emit('sideSwitch', side) + } }, getNavMode () { return this.navMode }, onResize () { // All other tabs are hidden and their width is most likely 0 - const tabContent = this.$refs.contents?.querySelector('.tab-content-wrapper.-active .tab-content') + const tabContent = this.$refs.contents.querySelector('.tab-content-wrapper.-active .tab-content') const tabContentWidth = tabContent.clientWidth - const navWidth = this.$refs.nav?.clientWidth - const contentsWidth = this.$refs.contents?.clientWidth + + const navWidth = this.$refs.nav.clientWidth + const contentsWidth = this.$refs.contents.clientWidth // if contents takes more space than its container if (contentsWidth < tabContentWidth) { @@ -193,8 +204,8 @@ export default { : '' const headerClasses = ['tab-content-label'] - console.log(this.hideHeader) - if (this.hideHeader) { + if (this.hideHeader === true) { + console.log('A', this.hideHeader) headerClasses.push('-hidden') } const header = ( From 9572b9704cefe1089811ebbb9929cefb451e5c0e Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Thu, 20 Nov 2025 22:06:02 +0200 Subject: [PATCH 31/38] fix logic not working on other tabs --- src/components/tab_switcher/vertical_tab_switcher.jsx | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/components/tab_switcher/vertical_tab_switcher.jsx b/src/components/tab_switcher/vertical_tab_switcher.jsx index 9341b2d77..074b90ec4 100644 --- a/src/components/tab_switcher/vertical_tab_switcher.jsx +++ b/src/components/tab_switcher/vertical_tab_switcher.jsx @@ -121,6 +121,7 @@ export default { if (this.navSide !== side) { this.navSide = side this.$emit('sideSwitch', side) + this.onResize() } }, getNavMode () { @@ -128,11 +129,13 @@ export default { }, onResize () { // All other tabs are hidden and their width is most likely 0 - const tabContent = this.$refs.contents.querySelector('.tab-content-wrapper.-active .tab-content') + const activeTab = this.$refs.root.querySelector('.tab-content-wrapper.-active') + const tabContent = activeTab.querySelector('.tab-content') const tabContentWidth = tabContent.clientWidth + const rootWidth = this.$refs.root.clientWidth const navWidth = this.$refs.nav.clientWidth - const contentsWidth = this.$refs.contents.clientWidth + const contentsWidth = rootWidth - navWidth // if contents takes more space than its container if (contentsWidth < tabContentWidth) { @@ -141,6 +144,7 @@ export default { } else { this.$emit('tooSmall') } + // FIXME wrong again?? // If we (theoretically) have enough space to fit it in } else if (contentsWidth - navWidth >= tabContentWidth){ // First expand the inner layer, then outer @@ -205,7 +209,6 @@ export default { const headerClasses = ['tab-content-label'] if (this.hideHeader === true) { - console.log('A', this.hideHeader) headerClasses.push('-hidden') } const header = ( From fba7d15a2c50137456fdc62b5baf385b066d8ca6 Mon Sep 17 00:00:00 2001 From: Henry Jameson Date: Mon, 24 Nov 2025 16:06:09 +0200 Subject: [PATCH 32/38] improve font control --- src/components/font_control/font_control.vue | 21 ++++++++------------ src/i18n/en.json | 7 +++++++ 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/components/font_control/font_control.vue b/src/components/font_control/font_control.vue index 5f4ed105c..9e2c338cf 100644 --- a/src/components/font_control/font_control.vue +++ b/src/components/font_control/font_control.vue @@ -1,13 +1,5 @@