From dd6e0ca26d9397d50cfd70b26724c5f1602b7f11 Mon Sep 17 00:00:00 2001 From: diondiondion Date: Tue, 30 Sep 2025 14:27:21 +0200 Subject: [PATCH] Update Follow button placement on profile page (#36298) --- .../mastodon/components/follow_button.tsx | 7 +- .../components/account_header.tsx | 38 +++++-- .../styles/mastodon/components.scss | 104 +++++++++++------- 3 files changed, 93 insertions(+), 56 deletions(-) diff --git a/app/javascript/mastodon/components/follow_button.tsx b/app/javascript/mastodon/components/follow_button.tsx index bc7966797f8..97aaecd1aac 100644 --- a/app/javascript/mastodon/components/follow_button.tsx +++ b/app/javascript/mastodon/components/follow_button.tsx @@ -58,7 +58,8 @@ export const FollowButton: React.FC<{ accountId?: string; compact?: boolean; labelLength?: 'auto' | 'short' | 'long'; -}> = ({ accountId, compact, labelLength = 'auto' }) => { + className?: string; +}> = ({ accountId, compact, labelLength = 'auto', className }) => { const intl = useIntl(); const dispatch = useAppDispatch(); const { signedIn } = useIdentity(); @@ -155,7 +156,7 @@ export const FollowButton: React.FC<{ href='/settings/profile' target='_blank' rel='noopener' - className={classNames('button button-secondary', { + className={classNames(className, 'button button-secondary', { 'button--compact': compact, })} > @@ -174,7 +175,7 @@ export const FollowButton: React.FC<{ } secondary={following} compact={compact} - className={following ? 'button--destructive' : undefined} + className={classNames(className, { 'button--destructive': following })} > {label} diff --git a/app/javascript/mastodon/features/account_timeline/components/account_header.tsx b/app/javascript/mastodon/features/account_timeline/components/account_header.tsx index 0e52667f664..093aa3a0a14 100644 --- a/app/javascript/mastodon/features/account_timeline/components/account_header.tsx +++ b/app/javascript/mastodon/features/account_timeline/components/account_header.tsx @@ -382,7 +382,7 @@ export const AccountHeader: React.FC<{ const isRemote = account?.acct !== account?.username; const remoteDomain = isRemote ? account?.acct.split('@')[1] : null; - const menu = useMemo(() => { + const menuItems = useMemo(() => { const arr: MenuItem[] = []; if (!account) { @@ -604,6 +604,15 @@ export const AccountHeader: React.FC<{ handleUnblockDomain, ]); + const menu = accountId !== me && ( + + ); + if (!account) { return null; } @@ -720,7 +729,13 @@ export const AccountHeader: React.FC<{ const isMovedAndUnfollowedAccount = account.moved && !relationship?.following; if (!isMovedAndUnfollowedAccount) { - actionBtn = ; + actionBtn = ( + + ); } if (account.locked) { @@ -802,18 +817,11 @@ export const AccountHeader: React.FC<{ /> -
+
+ {!hidden && actionBtn} {!hidden && bellBtn} {!hidden && shareBtn} - {accountId !== me && ( - - )} - {!hidden && actionBtn} + {menu}
@@ -843,6 +851,12 @@ export const AccountHeader: React.FC<{ )} +
+ {!hidden && actionBtn} + {!hidden && bellBtn} + {menu} +
+ {!(suspended || hidden) && (
= #{$button-breakpoint}) { + display: none; + } + + @supports (not (container-type: inline-size)) { + @media (min-width: (#{$button-fallback-breakpoint} + 1px)) { + display: none; + } + } + } + + .button { + flex-shrink: 1; + white-space: nowrap; + min-width: 80px; + } + + .icon-button { + border: 1px solid var(--background-border-color); + border-radius: 4px; + box-sizing: content-box; + padding: 5px; + + .icon { + width: 24px; + height: 24px; + } + + &.copied { + border-color: $valid-value-color; + } + } + } + &__bio { .account__header__content { color: $primary-text-color;