Add ALT badges to media that has alternative text in web UI (#24782)
This commit is contained in:
		
							parent
							
								
									6693a4fe7c
								
							
						
					
					
						commit
						8131a5b330
					
				@ -81,12 +81,10 @@ class Item extends React.PureComponent {
 | 
			
		||||
  render () {
 | 
			
		||||
    const { attachment, lang, index, size, standalone, displayWidth, visible } = this.props;
 | 
			
		||||
 | 
			
		||||
    let badges = [], thumbnail;
 | 
			
		||||
 | 
			
		||||
    let width  = 50;
 | 
			
		||||
    let height = 100;
 | 
			
		||||
    let top    = 'auto';
 | 
			
		||||
    let left   = 'auto';
 | 
			
		||||
    let bottom = 'auto';
 | 
			
		||||
    let right  = 'auto';
 | 
			
		||||
 | 
			
		||||
    if (size === 1) {
 | 
			
		||||
      width = 100;
 | 
			
		||||
@ -96,45 +94,13 @@ class Item extends React.PureComponent {
 | 
			
		||||
      height = 50;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (size === 2) {
 | 
			
		||||
      if (index === 0) {
 | 
			
		||||
        right = '2px';
 | 
			
		||||
      } else {
 | 
			
		||||
        left = '2px';
 | 
			
		||||
    if (attachment.get('description')?.length > 0) {
 | 
			
		||||
      badges.push(<span key='alt' className='media-gallery__gifv__label'>ALT</span>);
 | 
			
		||||
    }
 | 
			
		||||
    } else if (size === 3) {
 | 
			
		||||
      if (index === 0) {
 | 
			
		||||
        right = '2px';
 | 
			
		||||
      } else if (index > 0) {
 | 
			
		||||
        left = '2px';
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (index === 1) {
 | 
			
		||||
        bottom = '2px';
 | 
			
		||||
      } else if (index > 1) {
 | 
			
		||||
        top = '2px';
 | 
			
		||||
      }
 | 
			
		||||
    } else if (size === 4) {
 | 
			
		||||
      if (index === 0 || index === 2) {
 | 
			
		||||
        right = '2px';
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (index === 1 || index === 3) {
 | 
			
		||||
        left = '2px';
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (index < 2) {
 | 
			
		||||
        bottom = '2px';
 | 
			
		||||
      } else {
 | 
			
		||||
        top = '2px';
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    let thumbnail = '';
 | 
			
		||||
 | 
			
		||||
    if (attachment.get('type') === 'unknown') {
 | 
			
		||||
      return (
 | 
			
		||||
        <div className={classNames('media-gallery__item', { standalone })} key={attachment.get('id')} style={{ left: left, top: top, right: right, bottom: bottom, width: `${width}%`, height: `${height}%` }}>
 | 
			
		||||
        <div className={classNames('media-gallery__item', { standalone, 'media-gallery__item--tall': height === 100, 'media-gallery__item--wide': width === 100 })} key={attachment.get('id')}>
 | 
			
		||||
          <a className='media-gallery__item-thumbnail' href={attachment.get('remote_url') || attachment.get('url')} style={{ cursor: 'pointer' }} title={attachment.get('description')} lang={lang} target='_blank' rel='noopener noreferrer'>
 | 
			
		||||
            <Blurhash
 | 
			
		||||
              hash={attachment.get('blurhash')}
 | 
			
		||||
@ -184,6 +150,8 @@ class Item extends React.PureComponent {
 | 
			
		||||
    } else if (attachment.get('type') === 'gifv') {
 | 
			
		||||
      const autoPlay = this.getAutoPlay();
 | 
			
		||||
 | 
			
		||||
      badges.push(<span key='gif' className='media-gallery__gifv__label'>GIF</span>);
 | 
			
		||||
 | 
			
		||||
      thumbnail = (
 | 
			
		||||
        <div className={classNames('media-gallery__gifv', { autoplay: autoPlay })}>
 | 
			
		||||
          <video
 | 
			
		||||
@ -201,14 +169,12 @@ class Item extends React.PureComponent {
 | 
			
		||||
            loop
 | 
			
		||||
            muted
 | 
			
		||||
          />
 | 
			
		||||
 | 
			
		||||
          <span className='media-gallery__gifv__label'>GIF</span>
 | 
			
		||||
        </div>
 | 
			
		||||
      );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return (
 | 
			
		||||
      <div className={classNames('media-gallery__item', { standalone })} key={attachment.get('id')} style={{ left: left, top: top, right: right, bottom: bottom, width: `${width}%`, height: `${height}%` }}>
 | 
			
		||||
      <div className={classNames('media-gallery__item', { standalone, 'media-gallery__item--tall': height === 100, 'media-gallery__item--wide': width === 100 })} key={attachment.get('id')}>
 | 
			
		||||
        <Blurhash
 | 
			
		||||
          hash={attachment.get('blurhash')}
 | 
			
		||||
          dummy={!useBlurhash}
 | 
			
		||||
@ -216,7 +182,14 @@ class Item extends React.PureComponent {
 | 
			
		||||
            'media-gallery__preview--hidden': visible && this.state.loaded,
 | 
			
		||||
          })}
 | 
			
		||||
        />
 | 
			
		||||
 | 
			
		||||
        {visible && thumbnail}
 | 
			
		||||
 | 
			
		||||
        {badges && (
 | 
			
		||||
          <div className='media-gallery__item__badges'>
 | 
			
		||||
            {badges}
 | 
			
		||||
          </div>
 | 
			
		||||
        )}
 | 
			
		||||
      </div>
 | 
			
		||||
    );
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -6330,30 +6330,25 @@ a.status-card.compact:hover {
 | 
			
		||||
  z-index: 9999;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.media-gallery__gifv__label {
 | 
			
		||||
  display: block;
 | 
			
		||||
.media-gallery__item__badges {
 | 
			
		||||
  position: absolute;
 | 
			
		||||
  color: $primary-text-color;
 | 
			
		||||
  background: rgba($base-overlay-background, 0.5);
 | 
			
		||||
  bottom: 6px;
 | 
			
		||||
  inset-inline-start: 6px;
 | 
			
		||||
  padding: 2px 6px;
 | 
			
		||||
  border-radius: 2px;
 | 
			
		||||
  font-size: 11px;
 | 
			
		||||
  font-weight: 600;
 | 
			
		||||
  z-index: 1;
 | 
			
		||||
  pointer-events: none;
 | 
			
		||||
  opacity: 0.9;
 | 
			
		||||
  transition: opacity 0.1s ease;
 | 
			
		||||
  line-height: 18px;
 | 
			
		||||
  display: flex;
 | 
			
		||||
  gap: 2px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.media-gallery__gifv {
 | 
			
		||||
  &:hover {
 | 
			
		||||
    .media-gallery__gifv__label {
 | 
			
		||||
      opacity: 1;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
.media-gallery__gifv__label {
 | 
			
		||||
  display: block;
 | 
			
		||||
  color: $white;
 | 
			
		||||
  background: rgba($black, 0.65);
 | 
			
		||||
  padding: 2px 6px;
 | 
			
		||||
  border-radius: 4px;
 | 
			
		||||
  font-size: 11px;
 | 
			
		||||
  font-weight: 700;
 | 
			
		||||
  z-index: 1;
 | 
			
		||||
  pointer-events: none;
 | 
			
		||||
  line-height: 18px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.attachment-list {
 | 
			
		||||
@ -6428,17 +6423,28 @@ a.status-card.compact:hover {
 | 
			
		||||
  position: relative;
 | 
			
		||||
  width: 100%;
 | 
			
		||||
  min-height: 64px;
 | 
			
		||||
  display: grid;
 | 
			
		||||
  grid-template-columns: 50% 50%;
 | 
			
		||||
  grid-template-rows: 50% 50%;
 | 
			
		||||
  gap: 2px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.media-gallery__item {
 | 
			
		||||
  border: 0;
 | 
			
		||||
  box-sizing: border-box;
 | 
			
		||||
  display: block;
 | 
			
		||||
  float: left;
 | 
			
		||||
  position: relative;
 | 
			
		||||
  border-radius: 4px;
 | 
			
		||||
  overflow: hidden;
 | 
			
		||||
 | 
			
		||||
  &--tall {
 | 
			
		||||
    grid-row: span 2;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  &--wide {
 | 
			
		||||
    grid-column: span 2;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  &.standalone {
 | 
			
		||||
    .media-gallery__item-gifv-thumbnail {
 | 
			
		||||
      transform: none;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user