diff --git a/app/javascript/mastodon/components/status/prepend.module.scss b/app/javascript/mastodon/components/status/prepend.module.scss new file mode 100644 index 00000000000..3645d2d518a --- /dev/null +++ b/app/javascript/mastodon/components/status/prepend.module.scss @@ -0,0 +1,62 @@ +@use '@/styles/mastodon/mixins'; + +.root { + @include mixins.type-label-md; + + display: grid; + grid-template-columns: subgrid; + grid-template-rows: 1fr; + align-items: center; + color: var(--color-text-secondary); + grid-column: span 2; + + a { + color: inherit; + text-decoration: none; + + &:hover { + text-decoration: underline; + } + } + + // When hovering over any link with the account ID, underline them all. + &:has(a[data-id]:hover) a[data-id] { + text-decoration: underline; + } +} + +.reblogIcon { + padding-inline-end: var(--col-gap); + justify-self: end; + color: var(--color-text-brand); +} + +.replyIcon { + border-block-start: 2px solid var(--color-border-primary); + border-inline-start: 2px solid var(--color-border-primary); + border-top-left-radius: var(--radius-md); + box-sizing: border-box; + margin: var(--space-xs) var(--col-gap) 0 var(--space-2xs); + width: calc(var(--avatar-size) / 2 + 1px); + height: calc(100% - var(--space-xs)); + justify-self: end; +} + +.contents { + display: flex; + align-items: center; + gap: var(--space-2xs); +} + +// Add a tag to override .root a +a.account { + font-weight: bold; + color: var(--color-text-primary); +} + +.text { + @include mixins.line-clamp(1); + + display: block; + margin-block-start: var(--space-2xs); +} diff --git a/app/javascript/mastodon/components/status/prepend.tsx b/app/javascript/mastodon/components/status/prepend.tsx index d69eb8b621c..188225e4d1f 100644 --- a/app/javascript/mastodon/components/status/prepend.tsx +++ b/app/javascript/mastodon/components/status/prepend.tsx @@ -1,67 +1,135 @@ +import type React from 'react'; + import { FormattedMessage } from 'react-intl'; -import type { ExpandedStatusShape } from '@/mastodon/models/status'; -import AlternateEmailIcon from '@/material-icons/400-24px/alternate_email.svg?react'; -import RepeatIcon from '@/material-icons/400-24px/repeat.svg?react'; +import { Link } from 'react-router-dom'; -import { LinkedDisplayName } from '../display_name'; +import { ArrowsClockwiseIcon } from '@phosphor-icons/react'; + +import { useAccountStatus } from '@/mastodon/hooks/useStatus'; +import type { ExpandedStatusShape } from '@/mastodon/models/status'; + +import { Avatar } from '../avatar'; +import { DisplayName } from '../display_name'; +import { EmojiHTML } from '../emoji/html'; import { Icon } from '../icon'; -import { StatusThreadLabel } from '../status_thread_label'; +import { RelativeTimestamp } from '../relative_timestamp'; + +import { onStatusLinksDisabled } from './hooks'; +import classes from './prepend.module.scss'; +import { statusLink } from './utils'; export const StatusPrepend: React.FC<{ status: ExpandedStatusShape; + reblogId?: string; showThread?: boolean; - isReblog?: boolean; -}> = ({ status, showThread, isReblog }) => { - if (isReblog) { - return ( -