diff --git a/app/javascript/images/icons/icon_follower.svg b/app/javascript/images/icons/icon_follower.svg new file mode 100644 index 0000000000..8a7372fd58 --- /dev/null +++ b/app/javascript/images/icons/icon_follower.svg @@ -0,0 +1 @@ + diff --git a/app/javascript/mastodon/components/badge.stories.tsx b/app/javascript/mastodon/components/badge/badge.stories.tsx similarity index 92% rename from app/javascript/mastodon/components/badge.stories.tsx rename to app/javascript/mastodon/components/badge/badge.stories.tsx index 6c4921809c..f8d91d555a 100644 --- a/app/javascript/mastodon/components/badge.stories.tsx +++ b/app/javascript/mastodon/components/badge/badge.stories.tsx @@ -2,14 +2,20 @@ import type { Meta, StoryObj } from '@storybook/react-vite'; import CelebrationIcon from '@/material-icons/400-24px/celebration-fill.svg?react'; -import * as badges from './badge'; +import * as badges from '.'; const meta = { component: badges.Badge, title: 'Components/Badge', args: { + domain: '', label: undefined, }, + argTypes: { + domain: { + control: 'text', + }, + }, } satisfies Meta; export default meta; diff --git a/app/javascript/mastodon/components/badge.tsx b/app/javascript/mastodon/components/badge/index.tsx similarity index 89% rename from app/javascript/mastodon/components/badge.tsx rename to app/javascript/mastodon/components/badge/index.tsx index 54c28bf7b7..6c6f0cdca5 100644 --- a/app/javascript/mastodon/components/badge.tsx +++ b/app/javascript/mastodon/components/badge/index.tsx @@ -11,28 +11,38 @@ import PersonIcon from '@/material-icons/400-24px/person.svg?react'; import SmartToyIcon from '@/material-icons/400-24px/smart_toy.svg?react'; import VolumeOffIcon from '@/material-icons/400-24px/volume_off.svg?react'; +import classes from './styles.module.scss'; + interface BadgeProps { label: ReactNode; icon?: ReactNode; className?: string; domain?: ReactNode; roleId?: string; + variant?: + | 'default' + | 'subtle' + | 'inverted' + | 'success' + | 'warning' + | 'danger'; } export const Badge: FC = ({ icon = , + variant = 'default', label, className, domain, roleId, }) => (
{icon} {label} - {domain && {domain}} + {domain && {domain}}
); @@ -89,6 +99,7 @@ export const MutedBadge: FC< return ( } + variant='inverted' label={ label ?? (formattedDate ? ( @@ -111,6 +122,7 @@ export const MutedBadge: FC< export const BlockedBadge: FC> = ({ label, ...props }) => ( } + variant='danger' label={ label ?? ( svg { + width: auto; + height: 15px; + fill: currentColor; + opacity: 0.85; + } +} + +.domain { + opacity: 0.75; + letter-spacing: 0; +} + +.default { + background-color: var(--color-bg-secondary); +} + +.subtle { + background-color: var(--color-bg-brand-softest); +} + +.feature { + background-color: var(--color-bg-brand-base); + color: var(--color-text-on-brand-base); +} + +.inverted { + background-color: var(--color-bg-inverted); + color: var(--color-text-inverted); +} + +.success { + background-color: var(--color-bg-success-softest); + color: var(--color-text-success); +} + +.warning { + background-color: var(--color-bg-warning-softest); + color: var(--color-text-warning); +} + +.danger { + background-color: var(--color-bg-error-base); + color: var(--color-text-on-error-base); +} 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 e717a20c80..e13d0dee9e 100644 --- a/app/javascript/mastodon/features/account_timeline/components/account_header.tsx +++ b/app/javascript/mastodon/features/account_timeline/components/account_header.tsx @@ -156,7 +156,7 @@ export const AccountHeader: React.FC<{
diff --git a/app/javascript/mastodon/features/account_timeline/components/account_name.tsx b/app/javascript/mastodon/features/account_timeline/components/account_name.tsx index 3fd9e30c28..c90f5012de 100644 --- a/app/javascript/mastodon/features/account_timeline/components/account_name.tsx +++ b/app/javascript/mastodon/features/account_timeline/components/account_name.tsx @@ -7,9 +7,12 @@ import classNames from 'classnames'; import Overlay from 'react-overlays/esm/Overlay'; +import FollowerIcon from '@/images/icons/icon_follower.svg?react'; +import { Badge } from '@/mastodon/components/badge'; import { DisplayName } from '@/mastodon/components/display_name'; import { Icon } from '@/mastodon/components/icon'; import { useAccount } from '@/mastodon/hooks/useAccount'; +import { useRelationship } from '@/mastodon/hooks/useRelationship'; import { useAppSelector } from '@/mastodon/store'; import AtIcon from '@/material-icons/400-24px/alternate_email.svg?react'; import HelpIcon from '@/material-icons/400-24px/help.svg?react'; @@ -35,6 +38,7 @@ export const AccountName: FC<{ accountId: string }> = ({ accountId }) => { const localDomain = useAppSelector( (state) => state.meta.get('domain') as string, ); + const relationship = useRelationship(accountId); if (!account) { return null; @@ -43,10 +47,23 @@ export const AccountName: FC<{ accountId: string }> = ({ accountId }) => { const [username = '', domain = localDomain] = account.acct.split('@'); return ( -
-

- -

+
+
+

+ +

+ {relationship?.followed_by && ( + } + label={ + + } + /> + )} +

@{username}@{domain} = ({ accountId }) => { const account = useAccount(accountId); const localDomain = useAppSelector( @@ -53,7 +47,6 @@ export const AccountBadges: FC<{ accountId: string }> = ({ accountId }) => { , @@ -63,7 +56,6 @@ export const AccountBadges: FC<{ accountId: string }> = ({ accountId }) => { , @@ -72,25 +64,19 @@ export const AccountBadges: FC<{ accountId: string }> = ({ accountId }) => { }); if (account.bot) { - badges.push(); + badges.push(); } if (account.group) { - badges.push(); + badges.push(); } if (relationship) { if (relationship.blocking) { - badges.push( - , - ); + badges.push(); } if (relationship.domain_blocking) { badges.push( = ({ accountId }) => { badges.push( , ); @@ -119,16 +104,6 @@ export const AccountBadges: FC<{ accountId: string }> = ({ accountId }) => { return

{badges}
; }; -export const PinnedBadge: FC = () => ( - } - label={ - - } - /> -); - function isAdminBadge(role: AccountRole) { const name = role.name.toLowerCase(); return name === 'admin' || name === 'owner'; diff --git a/app/javascript/mastodon/features/account_timeline/components/redesign.module.scss b/app/javascript/mastodon/features/account_timeline/components/redesign.module.scss index 97395bd1ed..84f102cf06 100644 --- a/app/javascript/mastodon/features/account_timeline/components/redesign.module.scss +++ b/app/javascript/mastodon/features/account_timeline/components/redesign.module.scss @@ -17,14 +17,20 @@ padding-top: 0; } -.nameWrapper { +.displayNameWrapper { display: flex; align-items: start; gap: 16px; } -.name { +.nameWrapper { flex-grow: 1; +} + +.name { + display: flex; + gap: 2px; + align-items: baseline; > h1 { font-size: 22px; @@ -33,6 +39,10 @@ } } +.followerBadgeIcon { + color: var(--color-text-secondary); +} + .username { display: flex; font-size: 13px; @@ -165,38 +175,6 @@ $button-fallback-breakpoint: $button-breakpoint + 55px; font-size: 15px; } -.badge { - background-color: var(--color-bg-secondary); - border: none; - color: var(--color-text-secondary); - font-weight: 500; - padding: 4px; - font-size: 13px; - - :global(.account__header__badges) > & { - line-height: 1; - } - - > span { - font-weight: unset; - opacity: 1; - } -} - -.badgeMuted { - background-color: var(--color-bg-inverted); - color: var(--color-text-inverted); -} - -.badgeBlocked { - background-color: var(--color-bg-error-base); - color: var(--color-text-on-error-base); -} - -svg.badgeIcon { - opacity: 1; -} - .note { margin-bottom: 16px; } diff --git a/app/javascript/mastodon/features/account_timeline/v2/pinned_statuses.tsx b/app/javascript/mastodon/features/account_timeline/v2/pinned_statuses.tsx index 88503389c9..78dad72478 100644 --- a/app/javascript/mastodon/features/account_timeline/v2/pinned_statuses.tsx +++ b/app/javascript/mastodon/features/account_timeline/v2/pinned_statuses.tsx @@ -11,6 +11,7 @@ import { expandTimelineByKey, timelineKey, } from '@/mastodon/actions/timelines_typed'; +import { Badge } from '@/mastodon/components/badge'; import { Button } from '@/mastodon/components/button'; import { Icon } from '@/mastodon/components/icon'; import { StatusHeader } from '@/mastodon/components/status/header'; @@ -18,8 +19,6 @@ import type { StatusHeaderRenderFn } from '@/mastodon/components/status/header'; import { selectTimelineByKey } from '@/mastodon/selectors/timelines'; import { useAppDispatch, useAppSelector } from '@/mastodon/store'; -import { PinnedBadge } from '../components/badges'; - import { useAccountContext } from './context'; import classes from './styles.module.scss'; @@ -79,7 +78,16 @@ export const renderPinnedStatusHeader: StatusHeaderRenderFn = ({ } return ( - + } + label={ + + } + /> ); }; diff --git a/app/javascript/mastodon/features/account_timeline/v2/styles.module.scss b/app/javascript/mastodon/features/account_timeline/v2/styles.module.scss index a3629bf29b..f7dee496fb 100644 --- a/app/javascript/mastodon/features/account_timeline/v2/styles.module.scss +++ b/app/javascript/mastodon/features/account_timeline/v2/styles.module.scss @@ -118,8 +118,8 @@ > :global(.status__display-name) { grid-row: span 2; } - - > :global(.account-role) { - justify-self: end; - } +} + +.pinnedBadge { + justify-self: end; } diff --git a/app/javascript/styles/mastodon/accounts.scss b/app/javascript/styles/mastodon/accounts.scss index fad41b5eb8..924b12434b 100644 --- a/app/javascript/styles/mastodon/accounts.scss +++ b/app/javascript/styles/mastodon/accounts.scss @@ -225,34 +225,6 @@ } } -.account-role { - display: inline-flex; - padding: 4px; - padding-inline-end: 8px; - border: 1px solid var(--color-border-brand); - color: var(--color-text-brand); - font-weight: 500; - font-size: 12px; - letter-spacing: 0.5px; - line-height: 16px; - gap: 4px; - border-radius: 6px; - align-items: center; - - svg { - width: auto; - height: 15px; - opacity: 0.85; - fill: currentColor; - } - - &__domain { - font-weight: 400; - opacity: 0.75; - letter-spacing: 0; - } -} - .simple_form .not_recommended { color: var(--color-text-error); background-color: var(--color-bg-error-softest); diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss index 5a879faf7f..f37aac0534 100644 --- a/app/javascript/styles/mastodon/admin.scss +++ b/app/javascript/styles/mastodon/admin.scss @@ -1109,10 +1109,6 @@ a.name-tag, &:hover { color: var(--color-text-brand); } - - .account-role { - vertical-align: middle; - } } .icon { diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 593743a022..c84ec96ac7 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -8405,16 +8405,6 @@ noscript { } } - &__badges { - display: flex; - flex-wrap: wrap; - gap: 8px; - - .account-role { - line-height: unset; - } - } - &__tabs { display: flex; align-items: flex-start;