diff --git a/app/soapbox/components/media-gallery.tsx b/app/soapbox/components/media-gallery.tsx index 42b961dc1..9244f05d5 100644 --- a/app/soapbox/components/media-gallery.tsx +++ b/app/soapbox/components/media-gallery.tsx @@ -160,16 +160,22 @@ const Item: React.FC = ({ ); } else if (attachment.type === 'image') { - const letterboxed = shouldLetterbox(attachment); + const letterboxed = total === 1 && shouldLetterbox(attachment); thumbnail = ( - + ); } else if (attachment.type === 'gifv') { diff --git a/app/soapbox/components/profile-hover-card.tsx b/app/soapbox/components/profile-hover-card.tsx index 367c788e0..8ade427ca 100644 --- a/app/soapbox/components/profile-hover-card.tsx +++ b/app/soapbox/components/profile-hover-card.tsx @@ -136,7 +136,7 @@ export const ProfileHoverCard: React.FC = ({ visible = true } ) : null} - {account.source.get('note', '').length > 0 && ( + {account.note.length > 0 && ( )} diff --git a/app/soapbox/components/still-image.tsx b/app/soapbox/components/still-image.tsx index 24e212ce5..1f4f1a261 100644 --- a/app/soapbox/components/still-image.tsx +++ b/app/soapbox/components/still-image.tsx @@ -12,10 +12,14 @@ interface IStillImage { src: string, /** Extra CSS styles on the outer
element. */ style?: React.CSSProperties, + /** Whether to display the image contained vs filled in its container. */ + letterboxed?: boolean, + /** Whether to show the file extension in the corner. */ + showExt?: boolean, } /** Renders images on a canvas, only playing GIFs if autoPlayGif is enabled. */ -const StillImage: React.FC = ({ alt, className, src, style }) => { +const StillImage: React.FC = ({ alt, className, src, style, letterboxed = false, showExt = false }) => { const settings = useSettings(); const autoPlayGif = settings.get('autoPlayGif'); @@ -34,10 +38,56 @@ const StillImage: React.FC = ({ alt, className, src, style }) => { } }; + /** ClassNames shared between the `` and `` elements. */ + const baseClassName = classNames('w-full h-full block', { + 'object-contain': letterboxed, + 'object-cover': !letterboxed, + }); + return ( -
- {alt} - {hoverToPlay && } +
+ {alt} + + {hoverToPlay && ( + + )} + + {(hoverToPlay && showExt) && ( +
+ +
+ )} +
+ ); +}; + +interface IExtensionBadge { + /** File extension. */ + ext: string, +} + +/** Badge displaying a file extension. */ +const ExtensionBadge: React.FC = ({ ext }) => { + return ( +
+ {ext}
); }; diff --git a/app/soapbox/components/ui/card/card.tsx b/app/soapbox/components/ui/card/card.tsx index 59f6ee1bc..a2d181e3a 100644 --- a/app/soapbox/components/ui/card/card.tsx +++ b/app/soapbox/components/ui/card/card.tsx @@ -33,7 +33,7 @@ const Card = React.forwardRef(({ children, variant = 'def ref={ref} {...filteredProps} className={classNames({ - 'bg-white dark:bg-primary-900 text-gray-900 dark:text-gray-100 shadow-lg dark:shadow-none overflow-hidden': variant === 'rounded', + 'bg-white dark:bg-primary-900 text-gray-900 dark:text-gray-100 shadow-lg dark:shadow-none overflow-hidden isolate': variant === 'rounded', [sizes[size]]: variant === 'rounded', }, className)} > diff --git a/app/soapbox/features/account-gallery/components/media-item.tsx b/app/soapbox/features/account-gallery/components/media-item.tsx index a2a171bfc..4242094b5 100644 --- a/app/soapbox/features/account-gallery/components/media-item.tsx +++ b/app/soapbox/features/account-gallery/components/media-item.tsx @@ -74,6 +74,7 @@ const MediaItem: React.FC = ({ attachment, displayWidth, onOpenMedia src={attachment.preview_url} alt={attachment.description} style={{ objectPosition: `${x}% ${y}%` }} + className='w-full h-full rounded-lg overflow-hidden' /> ); } else if (['gifv', 'video'].indexOf(attachment.type) !== -1) { diff --git a/app/soapbox/features/account/components/header.tsx b/app/soapbox/features/account/components/header.tsx index 4aa4d3b05..d3d7865b6 100644 --- a/app/soapbox/features/account/components/header.tsx +++ b/app/soapbox/features/account/components/header.tsx @@ -551,13 +551,12 @@ const Header: React.FC = ({ account }) => { )}
-
+
{account.header && ( )} @@ -577,7 +576,7 @@ const Header: React.FC = ({ account }) => {
diff --git a/app/soapbox/features/ui/components/user-panel.tsx b/app/soapbox/features/ui/components/user-panel.tsx index 8f0fbf517..918d94efd 100644 --- a/app/soapbox/features/ui/components/user-panel.tsx +++ b/app/soapbox/features/ui/components/user-panel.tsx @@ -36,13 +36,9 @@ const UserPanel: React.FC = ({ accountId, action, badges, domain })
-
+
{header && ( - + )}
diff --git a/app/styles/accounts.scss b/app/styles/accounts.scss index e4a0833c7..e24a19ddf 100644 --- a/app/styles/accounts.scss +++ b/app/styles/accounts.scss @@ -72,10 +72,6 @@ a .account__avatar { bottom: 0; right: 0; z-index: 1; - - &.still-image { - position: absolute; - } } } diff --git a/app/styles/application.scss b/app/styles/application.scss index da62ca314..2d7428ad6 100644 --- a/app/styles/application.scss +++ b/app/styles/application.scss @@ -44,7 +44,6 @@ @import 'components/columns'; @import 'components/search'; @import 'components/react-toggle'; -@import 'components/still-image'; @import 'components/spoiler-button'; @import 'components/video-player'; @import 'components/audio-player'; diff --git a/app/styles/chats.scss b/app/styles/chats.scss index 7c98b11ff..d2f00aeff 100644 --- a/app/styles/chats.scss +++ b/app/styles/chats.scss @@ -356,11 +356,6 @@ &__preview { background-color: transparent; } - - &__item-thumbnail img, - &__item-thumbnail .still-image img { - object-fit: contain; - } } .chat-messages__divider { diff --git a/app/styles/components/media-gallery.scss b/app/styles/components/media-gallery.scss index 664600893..25d953dfa 100644 --- a/app/styles/components/media-gallery.scss +++ b/app/styles/components/media-gallery.scss @@ -57,33 +57,8 @@ line-height: 0; position: relative; z-index: 1; - - &, - .still-image { - height: 100%; - width: 100%; - - img { - @apply object-cover rounded-lg; - } - } - - .still-image--play-on-hover::before { - content: 'GIF'; - position: absolute; - color: var(--primary-text-color); - background: var(--foreground-color); - bottom: 6px; - left: 6px; - padding: 2px 6px; - border-radius: 2px; - font-size: 11px; - font-weight: 600; - pointer-events: none; - opacity: 0.9; - transition: opacity 0.1s ease; - line-height: 18px; - } + height: 100%; + width: 100%; video { width: 100%; @@ -92,17 +67,6 @@ } } -.status__wrapper { - .media-gallery__item-thumbnail.letterboxed { - &, - .still-image { - img { - object-fit: contain; - } - } - } -} - .media-gallery__preview { @apply bg-gray-200 dark:bg-gray-900 rounded-lg; width: 100%; @@ -113,23 +77,6 @@ left: 0; z-index: 0; - .still-image--play-on-hover::before { - content: 'GIF'; - position: absolute; - color: var(--primary-text-color); - background: var(--foreground-color); - bottom: 6px; - left: 6px; - padding: 2px 6px; - border-radius: 2px; - font-size: 11px; - font-weight: 600; - pointer-events: none; - opacity: 0.9; - transition: opacity 0.1s ease; - line-height: 18px; - } - &--hidden { display: none; } diff --git a/app/styles/components/still-image.scss b/app/styles/components/still-image.scss deleted file mode 100644 index 0b86d6ada..000000000 --- a/app/styles/components/still-image.scss +++ /dev/null @@ -1,28 +0,0 @@ -.still-image { - position: relative; - overflow: hidden; - - img, - canvas { - width: 100%; - height: 100%; - display: block; - object-fit: cover; - font-family: inherit; - } - - &--play-on-hover { - img { - position: absolute; - visibility: hidden; - } - - &:hover img { - visibility: visible; - } - - &:hover canvas { - visibility: hidden; - } - } -}