From bc7c83ba769fde23ccd81087eebf28d05c64ee33 Mon Sep 17 00:00:00 2001 From: Claire Date: Wed, 19 Nov 2025 16:28:57 +0100 Subject: [PATCH 1/9] Update `glob` dependency (#36940) --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 3c816b4730..a56fc1f72e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7851,8 +7851,8 @@ __metadata: linkType: hard "glob@npm:^10.0.0, glob@npm:^10.2.2": - version: 10.4.5 - resolution: "glob@npm:10.4.5" + version: 10.5.0 + resolution: "glob@npm:10.5.0" dependencies: foreground-child: "npm:^3.1.0" jackspeak: "npm:^3.1.2" @@ -7862,7 +7862,7 @@ __metadata: path-scurry: "npm:^1.11.1" bin: glob: dist/esm/bin.mjs - checksum: 10c0/19a9759ea77b8e3ca0a43c2f07ecddc2ad46216b786bb8f993c445aee80d345925a21e5280c7b7c6c59e860a0154b84e4b2b60321fea92cd3c56b4a7489f160e + checksum: 10c0/100705eddbde6323e7b35e1d1ac28bcb58322095bd8e63a7d0bef1a2cdafe0d0f7922a981b2b48369a4f8c1b077be5c171804534c3509dfe950dde15fbe6d828 languageName: node linkType: hard From 01b11c328c430b0756d8dfbf776eee3c31860a74 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 19 Nov 2025 16:37:02 +0100 Subject: [PATCH 2/9] chore(deps): update dependency i18n-tasks to v1.1.0 (#36907) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- Gemfile.lock | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Gemfile.lock b/Gemfile.lock index 4f24c4106d..6194227ed7 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -182,7 +182,7 @@ GEM activerecord (>= 5.a) database_cleaner-core (~> 2.0) database_cleaner-core (2.0.1) - date (3.4.1) + date (3.5.0) debug (1.11.0) irb (~> 1.10) reline (>= 0.3.8) @@ -324,13 +324,14 @@ GEM rainbow (>= 2.0.0) i18n (1.14.7) concurrent-ruby (~> 1.0) - i18n-tasks (1.0.15) + i18n-tasks (1.1.0) activesupport (>= 4.0.2) ast (>= 2.1.0) erubi - highline (>= 2.0.0) + highline (>= 3.0.0) i18n parser (>= 3.2.2.1) + prism rails-i18n rainbow (>= 2.2.2, < 4.0) ruby-progressbar (~> 1.8, >= 1.8.1) @@ -446,7 +447,7 @@ GEM mime-types-data (3.2025.0924) mini_mime (1.1.5) mini_portile2 (2.8.9) - minitest (5.26.1) + minitest (5.26.2) msgpack (1.8.0) multi_json (1.17.0) mutex_m (0.3.0) @@ -684,7 +685,7 @@ GEM tsort (>= 0.2) zeitwerk (~> 2.6) rainbow (3.1.1) - rake (13.3.0) + rake (13.3.1) rdf (3.3.4) bcp47_spec (~> 0.2) bigdecimal (~> 3.1, >= 3.1.5) @@ -705,7 +706,7 @@ GEM redis-client (0.26.1) connection_pool regexp_parser (2.11.3) - reline (0.6.2) + reline (0.6.3) io-console (~> 0.5) request_store (1.7.0) rack (>= 1.4) @@ -840,7 +841,7 @@ GEM base64 stoplight (5.6.0) zeitwerk - stringio (3.1.7) + stringio (3.1.8) strong_migrations (2.5.1) activerecord (>= 7.1) swd (2.0.3) From ea616ac4a4981323a567f2f4e28d893ce4cad81c Mon Sep 17 00:00:00 2001 From: Echo Date: Wed, 19 Nov 2025 16:56:24 +0100 Subject: [PATCH 3/9] Improve media modal swipe animation (#36916) --- .../features/ui/components/media_modal.tsx | 51 +++++++++++++------ 1 file changed, 35 insertions(+), 16 deletions(-) diff --git a/app/javascript/mastodon/features/ui/components/media_modal.tsx b/app/javascript/mastodon/features/ui/components/media_modal.tsx index 7ba2fb7b73..daa0aebeb3 100644 --- a/app/javascript/mastodon/features/ui/components/media_modal.tsx +++ b/app/javascript/mastodon/features/ui/components/media_modal.tsx @@ -46,6 +46,8 @@ interface MediaModalProps { volume?: number; } +const MIN_SWIPE_DISTANCE = 400; + export const MediaModal: FC = forwardRef< HTMLDivElement, MediaModalProps @@ -69,21 +71,30 @@ export const MediaModal: FC = forwardRef< const [zoomedIn, setZoomedIn] = useState(false); const currentMedia = media.get(index); + const [wrapperStyles, api] = useSpring(() => ({ + x: `-${index * 100}%`, + })); + const handleChangeIndex = useCallback( - (newIndex: number) => { + (newIndex: number, animate = false) => { if (newIndex < 0) { newIndex = media.size + newIndex; + } else if (newIndex >= media.size) { + newIndex = newIndex % media.size; } - setIndex(newIndex % media.size); + setIndex(newIndex); setZoomedIn(false); + if (animate) { + void api.start({ x: `-${newIndex * 100}%` }); + } }, - [media.size], + [api, media.size], ); const handlePrevClick = useCallback(() => { - handleChangeIndex(index - 1); + handleChangeIndex(index - 1, true); }, [handleChangeIndex, index]); const handleNextClick = useCallback(() => { - handleChangeIndex(index + 1); + handleChangeIndex(index + 1, true); }, [handleChangeIndex, index]); const handleKeyDown = useCallback( @@ -101,6 +112,25 @@ export const MediaModal: FC = forwardRef< [handleNextClick, handlePrevClick], ); + const bind = useDrag( + ({ active, movement: [mx], direction: [xDir], cancel }) => { + // If dragging and swipe distance is enough, change the index. + if ( + active && + Math.abs(mx) > Math.min(window.innerWidth / 4, MIN_SWIPE_DISTANCE) + ) { + handleChangeIndex(index - xDir); + cancel(); + } + // Set the x position via calc to ensure proper centering regardless of screen size. + const x = active ? mx : 0; + void api.start({ + x: `calc(-${index * 100}% + ${x}px)`, + }); + }, + { pointer: { capture: false } }, + ); + useEffect(() => { window.addEventListener('keydown', handleKeyDown, false); @@ -145,17 +175,6 @@ export const MediaModal: FC = forwardRef< setZoomedIn((prev) => !prev); }, []); - const wrapperStyles = useSpring({ - x: `-${index * 100}%`, - }); - const bind = useDrag( - ({ swipe: [swipeX] }) => { - if (swipeX === 0) return; - handleChangeIndex(index + swipeX * -1); // Invert swipe as swiping left loads the next slide. - }, - { pointer: { capture: false } }, - ); - const [navigationHidden, setNavigationHidden] = useState(false); const handleToggleNavigation = useCallback(() => { setNavigationHidden((prev) => !prev); From bb9a633b990d6073a1ff9a52b411cdaa34d617bc Mon Sep 17 00:00:00 2001 From: Claire Date: Thu, 20 Nov 2025 10:52:53 +0100 Subject: [PATCH 4/9] Fix statuses without text disappearing on reload (#36962) --- app/javascript/mastodon/selectors/index.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/javascript/mastodon/selectors/index.js b/app/javascript/mastodon/selectors/index.js index 157c2f4a5a..471c7af411 100644 --- a/app/javascript/mastodon/selectors/index.js +++ b/app/javascript/mastodon/selectors/index.js @@ -32,7 +32,11 @@ function getStatusResultFunction( }; } - if (statusBase.get('isLoading') && !statusBase.get('content')) { + // When a status is loading, a `isLoading` property is set + // A status can be loading because it is not known yet (in which case it will only contain `isLoading`) + // or because it is being re-fetched; in the latter case, `visibility` will always be set to a non-empty + // string. + if (statusBase.get('isLoading') && !statusBase.get('visibility')) { return { status: null, loadingState: 'loading', From dc67dbba8265b290d5f9740dae039c75016ab2fa Mon Sep 17 00:00:00 2001 From: Darius Kazemi Date: Thu, 20 Nov 2025 02:02:50 -0800 Subject: [PATCH 5/9] Remove stray Font Awesome styles (#36960) --- app/javascript/styles/mastodon/widgets.scss | 5 ----- app/javascript/styles_new/mastodon/widgets.scss | 5 ----- 2 files changed, 10 deletions(-) diff --git a/app/javascript/styles/mastodon/widgets.scss b/app/javascript/styles/mastodon/widgets.scss index 266a9ca930..f3ddf341d2 100644 --- a/app/javascript/styles/mastodon/widgets.scss +++ b/app/javascript/styles/mastodon/widgets.scss @@ -47,10 +47,6 @@ overflow: hidden; text-overflow: ellipsis; - .fa { - color: $darker-text-color; - } - small { display: block; font-weight: 400; @@ -62,7 +58,6 @@ &.active h4 { &, - .fa, small, .trends__item__current { color: $primary-text-color; diff --git a/app/javascript/styles_new/mastodon/widgets.scss b/app/javascript/styles_new/mastodon/widgets.scss index c35f58eda3..69c79cd1e6 100644 --- a/app/javascript/styles_new/mastodon/widgets.scss +++ b/app/javascript/styles_new/mastodon/widgets.scss @@ -46,10 +46,6 @@ overflow: hidden; text-overflow: ellipsis; - .fa { - color: var(--color-text-secondary); - } - small { display: block; font-weight: 400; @@ -61,7 +57,6 @@ &.active h4 { &, - .fa, small, .trends__item__current { color: var(--color-text-primary); From f01e80bed3788409ecdea46029f9eeca417351bd Mon Sep 17 00:00:00 2001 From: diondiondion Date: Thu, 20 Nov 2025 11:08:00 +0100 Subject: [PATCH 6/9] Fix error when visiting non-public hashtag timelines (#36961) --- .../components/hashtag_header.tsx | 17 ++++++----- .../features/hashtag_timeline/index.jsx | 29 +++++++++++++++---- .../ui/containers/status_list_container.js | 4 +-- app/javascript/mastodon/locales/en.json | 1 + 4 files changed, 36 insertions(+), 15 deletions(-) diff --git a/app/javascript/mastodon/features/hashtag_timeline/components/hashtag_header.tsx b/app/javascript/mastodon/features/hashtag_timeline/components/hashtag_header.tsx index c11874e7d4..fafe186cb4 100644 --- a/app/javascript/mastodon/features/hashtag_timeline/components/hashtag_header.tsx +++ b/app/javascript/mastodon/features/hashtag_timeline/components/hashtag_header.tsx @@ -197,13 +197,16 @@ export const HashtagHeader: React.FC<{ /> )} -