| 
									
										
										
										
											2018-01-30 21:02:07 -08:00
										 |  |  | <article class="status-article {{originalStatus.visibility === 'direct' ? 'status-direct' : ''}} {{isStatusInContext ? 'status-in-context' : ''}}" | 
					
						
							|  |  |  |          tabindex="0" | 
					
						
							| 
									
										
										
										
											2018-01-27 18:25:49 -08:00
										 |  |  |          aria-posinset="{{index}}" aria-setsize="{{length}}" | 
					
						
							|  |  |  |          on:recalculateHeight> | 
					
						
							| 
									
										
										
										
											2018-02-04 10:05:01 -08:00
										 |  |  |   {{#if (notification && (notification.type === 'reblog' || notification.type === 'favourite')) || status.reblog}} | 
					
						
							|  |  |  |     <StatusHeader :notification :status /> | 
					
						
							| 
									
										
										
										
											2018-01-21 10:32:18 -08:00
										 |  |  |   {{/if}} | 
					
						
							| 
									
										
										
										
											2018-02-04 10:23:18 -08:00
										 |  |  |   <StatusAuthor status="{{originalStatus}}" :isStatusInContext /> | 
					
						
							| 
									
										
										
										
											2018-01-31 18:20:30 -08:00
										 |  |  |   <Avatar account={{originalAccount}} className="status-sidebar" size="small" /> | 
					
						
							| 
									
										
										
										
											2018-01-23 18:25:05 -08:00
										 |  |  |   {{#if originalStatus.spoiler_text}} | 
					
						
							|  |  |  |     <div class="status-spoiler">{{originalStatus.spoiler_text}}</div> | 
					
						
							| 
									
										
										
										
											2018-01-21 10:32:18 -08:00
										 |  |  |   {{/if}} | 
					
						
							| 
									
										
										
										
											2018-01-23 18:25:05 -08:00
										 |  |  |   {{#if originalStatus.spoiler_text}} | 
					
						
							| 
									
										
										
										
											2018-01-21 10:32:18 -08:00
										 |  |  |     <div class="status-spoiler-button"> | 
					
						
							| 
									
										
										
										
											2018-01-21 12:34:35 -08:00
										 |  |  |       <button type="button" on:click="onClickSpoilerButton()">{{spoilerShown ? 'Show less' : 'Show more'}}</button> | 
					
						
							| 
									
										
										
										
											2018-01-21 10:32:18 -08:00
										 |  |  |     </div> | 
					
						
							|  |  |  |   {{/if}} | 
					
						
							| 
									
										
										
										
											2018-01-23 18:25:05 -08:00
										 |  |  |   {{#if !originalStatus.spoiler_text || spoilerShown}} | 
					
						
							| 
									
										
										
										
											2018-01-30 21:02:07 -08:00
										 |  |  |     <div class="status-content" ref:contentNode> | 
					
						
							| 
									
										
										
										
											2018-01-22 21:16:27 -08:00
										 |  |  |       {{{emojifiedContent}}} | 
					
						
							| 
									
										
										
										
											2018-01-21 10:32:18 -08:00
										 |  |  |     </div> | 
					
						
							|  |  |  |   {{/if}} | 
					
						
							| 
									
										
										
										
											2018-01-21 12:34:35 -08:00
										 |  |  |   {{#if originalMediaAttachments && originalMediaAttachments.length}} | 
					
						
							| 
									
										
										
										
											2018-02-04 10:16:27 -08:00
										 |  |  |     <MediaAttachments | 
					
						
							|  |  |  |       status="{{originalStatus}}" | 
					
						
							|  |  |  |       mediaAttachments="{{originalMediaAttachments}}" | 
					
						
							|  |  |  |       on:recalculateHeight | 
					
						
							|  |  |  |       /> | 
					
						
							| 
									
										
										
										
											2018-01-21 12:34:35 -08:00
										 |  |  |   {{/if}} | 
					
						
							| 
									
										
										
										
											2018-01-20 21:42:46 -08:00
										 |  |  |   <Toolbar :status /> | 
					
						
							| 
									
										
										
										
											2018-01-10 20:45:02 -08:00
										 |  |  | </article> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <style> | 
					
						
							| 
									
										
										
										
											2018-01-16 08:38:23 -08:00
										 |  |  |   .status-article { | 
					
						
							| 
									
										
										
										
											2018-01-16 08:44:35 -08:00
										 |  |  |     width: 560px; | 
					
						
							|  |  |  |     max-width: calc(100vw - 40px); | 
					
						
							|  |  |  |     padding: 10px 20px; | 
					
						
							| 
									
										
										
										
											2018-02-04 10:05:01 -08:00
										 |  |  |     border-bottom: 1px solid var(--main-border); | 
					
						
							| 
									
										
										
										
											2018-01-10 20:45:02 -08:00
										 |  |  |     display: grid; | 
					
						
							|  |  |  |     grid-template-areas: | 
					
						
							| 
									
										
										
										
											2018-02-04 10:05:01 -08:00
										 |  |  |         ".............. status-header" | 
					
						
							| 
									
										
										
										
											2018-01-16 08:51:05 -08:00
										 |  |  |         "status-sidebar status-author" | 
					
						
							| 
									
										
										
										
											2018-01-21 10:32:18 -08:00
										 |  |  |         "status-sidebar status-spoiler" | 
					
						
							|  |  |  |         "status-sidebar status-spoiler-button" | 
					
						
							| 
									
										
										
										
											2018-01-16 08:51:05 -08:00
										 |  |  |         "status-sidebar status-content" | 
					
						
							| 
									
										
										
										
											2018-01-21 12:34:35 -08:00
										 |  |  |         "status-media   status-media" | 
					
						
							|  |  |  |         ".............. status-toolbar"; | 
					
						
							| 
									
										
										
										
											2018-01-16 08:44:35 -08:00
										 |  |  |     grid-template-columns: 58px 1fr; | 
					
						
							| 
									
										
										
										
											2018-01-21 13:35:03 -08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2018-01-16 08:38:23 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-27 18:25:49 -08:00
										 |  |  |   .status-article.status-direct { | 
					
						
							|  |  |  |     background-color: var(--status-direct-background); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-16 08:51:05 -08:00
										 |  |  |   :global(.status-sidebar) { | 
					
						
							|  |  |  |     grid-area: status-sidebar; | 
					
						
							| 
									
										
										
										
											2018-01-16 08:44:35 -08:00
										 |  |  |     margin: 0 10px 0 0; | 
					
						
							| 
									
										
										
										
											2018-01-10 20:45:02 -08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-21 10:32:18 -08:00
										 |  |  |   .status-spoiler { | 
					
						
							|  |  |  |     grid-area: status-spoiler; | 
					
						
							|  |  |  |     word-wrap: break-word; | 
					
						
							|  |  |  |     overflow: hidden; | 
					
						
							|  |  |  |     white-space: pre-wrap; | 
					
						
							|  |  |  |     font-size: 1.1em; | 
					
						
							|  |  |  |     margin: 5px; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   .status-spoiler-button { | 
					
						
							|  |  |  |     grid-area: status-spoiler-button; | 
					
						
							|  |  |  |     margin: 5px; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   .status-spoiler-button button { | 
					
						
							|  |  |  |     padding: 5px 10px; | 
					
						
							|  |  |  |     font-size: 1.1em; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-16 08:51:05 -08:00
										 |  |  |   .status-content { | 
					
						
							| 
									
										
										
										
											2018-01-21 10:32:18 -08:00
										 |  |  |     margin: 10px 10px 10px 5px; | 
					
						
							| 
									
										
										
										
											2018-01-16 08:51:05 -08:00
										 |  |  |     grid-area: status-content; | 
					
						
							| 
									
										
										
										
											2018-01-10 20:45:02 -08:00
										 |  |  |     word-wrap: break-word; | 
					
						
							|  |  |  |     overflow: hidden; | 
					
						
							|  |  |  |     white-space: pre-wrap; | 
					
						
							| 
									
										
										
										
											2018-01-11 00:26:35 -08:00
										 |  |  |     font-size: 0.9em; | 
					
						
							| 
									
										
										
										
											2018-01-10 20:45:02 -08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-30 21:02:07 -08:00
										 |  |  |   .status-in-context .status-content { | 
					
						
							|  |  |  |     font-size: 1.3em; | 
					
						
							| 
									
										
										
										
											2018-01-30 18:26:13 -08:00
										 |  |  |     margin: 20px 10px 20px 5px; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-21 22:46:27 -08:00
										 |  |  |   :global(.status-content .status-emoji) { | 
					
						
							|  |  |  |     width: 20px; | 
					
						
							|  |  |  |     height: 20px; | 
					
						
							|  |  |  |     margin: -3px 0; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-16 08:51:05 -08:00
										 |  |  |   :global(.status-content p) { | 
					
						
							| 
									
										
										
										
											2018-01-14 19:28:50 -08:00
										 |  |  |     margin: 0 0 20px; | 
					
						
							| 
									
										
										
										
											2018-01-10 21:31:33 -08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-16 08:51:05 -08:00
										 |  |  |   :global(.status-content p:first-child) { | 
					
						
							| 
									
										
										
										
											2018-01-14 19:28:50 -08:00
										 |  |  |     margin: 0 0 20px; | 
					
						
							| 
									
										
										
										
											2018-01-10 21:31:33 -08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-16 08:51:05 -08:00
										 |  |  |   :global(.status-content p:last-child) { | 
					
						
							| 
									
										
										
										
											2018-01-14 19:28:50 -08:00
										 |  |  |     margin: 0; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-30 22:40:40 -08:00
										 |  |  |   @media (max-width: 767px) { | 
					
						
							|  |  |  |     .status-article { | 
					
						
							|  |  |  |       padding: 10px 10px; | 
					
						
							|  |  |  |       max-width: calc(100vw - 20px); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2018-01-10 20:45:02 -08:00
										 |  |  | </style> | 
					
						
							|  |  |  | <script> | 
					
						
							|  |  |  |   import Avatar from './Avatar.html' | 
					
						
							| 
									
										
										
										
											2018-02-04 10:16:27 -08:00
										 |  |  |   import MediaAttachments from './MediaAttachments.html' | 
					
						
							| 
									
										
										
										
											2018-02-04 10:23:18 -08:00
										 |  |  |   import StatusAuthor from './StatusAuthor.html' | 
					
						
							| 
									
										
										
										
											2018-01-20 21:42:46 -08:00
										 |  |  |   import Toolbar from './Toolbar.html' | 
					
						
							| 
									
										
										
										
											2018-02-04 10:05:01 -08:00
										 |  |  |   import StatusHeader from './StatusHeader.html' | 
					
						
							| 
									
										
										
										
											2018-02-04 10:23:18 -08:00
										 |  |  |   import ExternalLink from '../ExternalLink.html' | 
					
						
							| 
									
										
										
										
											2018-01-27 16:35:44 -08:00
										 |  |  |   import { mark, stop } from '../../_utils/marks' | 
					
						
							| 
									
										
										
										
											2018-01-28 15:02:02 -08:00
										 |  |  |   import { replaceAll } from '../../_utils/strings' | 
					
						
							| 
									
										
										
										
											2018-01-28 13:09:39 -08:00
										 |  |  |   import { store } from '../../_store/store' | 
					
						
							| 
									
										
										
										
											2018-01-10 20:45:02 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   export default { | 
					
						
							| 
									
										
										
										
											2018-01-22 21:16:27 -08:00
										 |  |  |     oncreate() { | 
					
						
							| 
									
										
										
										
											2018-01-24 19:48:25 -08:00
										 |  |  |       this.hydrateContent() | 
					
						
							| 
									
										
										
										
											2018-01-22 21:16:27 -08:00
										 |  |  |     }, | 
					
						
							| 
									
										
										
										
											2018-01-10 20:45:02 -08:00
										 |  |  |     components: { | 
					
						
							| 
									
										
										
										
											2018-01-20 15:37:40 -08:00
										 |  |  |       Avatar, | 
					
						
							| 
									
										
										
										
											2018-02-04 10:16:27 -08:00
										 |  |  |       MediaAttachments, | 
					
						
							| 
									
										
										
										
											2018-01-28 19:01:51 -08:00
										 |  |  |       Toolbar, | 
					
						
							| 
									
										
										
										
											2018-02-04 10:05:01 -08:00
										 |  |  |       ExternalLink, | 
					
						
							| 
									
										
										
										
											2018-02-04 10:23:18 -08:00
										 |  |  |       StatusHeader, | 
					
						
							|  |  |  |       StatusAuthor | 
					
						
							| 
									
										
										
										
											2018-01-10 20:45:02 -08:00
										 |  |  |     }, | 
					
						
							| 
									
										
										
										
											2018-01-23 20:56:07 -08:00
										 |  |  |     store: () => store, | 
					
						
							| 
									
										
										
										
											2018-01-14 19:28:50 -08:00
										 |  |  |     computed: { | 
					
						
							| 
									
										
										
										
											2018-02-04 10:23:18 -08:00
										 |  |  |       isStatusInContext: (timelineType, timelineValue, statusId) => timelineType === 'status' && timelineValue === statusId, | 
					
						
							| 
									
										
										
										
											2018-01-19 00:51:51 -08:00
										 |  |  |       originalStatus: (status) => status.reblog ? status.reblog : status, | 
					
						
							|  |  |  |       originalAccount: (originalStatus) => originalStatus.account, | 
					
						
							| 
									
										
										
										
											2018-01-21 22:46:27 -08:00
										 |  |  |       originalMediaAttachments: (originalStatus) => originalStatus.media_attachments, | 
					
						
							| 
									
										
										
										
											2018-01-23 20:56:07 -08:00
										 |  |  |       statusId: (originalStatus) => originalStatus.id, | 
					
						
							| 
									
										
										
										
											2018-01-31 18:22:47 -08:00
										 |  |  |       emojifiedContent: (originalStatus, $autoplayGifs) => { | 
					
						
							| 
									
										
										
										
											2018-01-21 22:46:27 -08:00
										 |  |  |         let status = originalStatus | 
					
						
							|  |  |  |         let content = status.content | 
					
						
							|  |  |  |         if (status.emojis && status.emojis.length) { | 
					
						
							|  |  |  |           for (let emoji of status.emojis) { | 
					
						
							| 
									
										
										
										
											2018-01-31 18:22:47 -08:00
										 |  |  |             let { shortcode, url, url_static } = emoji | 
					
						
							|  |  |  |             let urlToUse = $autoplayGifs ? url : url_static | 
					
						
							| 
									
										
										
										
											2018-01-21 22:46:27 -08:00
										 |  |  |             let shortcodeWithColons = `:${shortcode}:` | 
					
						
							|  |  |  |             content = replaceAll( | 
					
						
							|  |  |  |               content, | 
					
						
							|  |  |  |               shortcodeWithColons, | 
					
						
							|  |  |  |               `<img class="status-emoji" draggable="false" src="${url}" alt="${shortcodeWithColons}" title="${shortcodeWithColons}" />` | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return content | 
					
						
							| 
									
										
										
										
											2018-01-23 20:56:07 -08:00
										 |  |  |       }, | 
					
						
							| 
									
										
										
										
											2018-02-04 10:16:27 -08:00
										 |  |  |       spoilerShown: ($spoilersShown, $currentInstance, statusId) => $spoilersShown && $spoilersShown[$currentInstance] && $spoilersShown[$currentInstance][statusId] | 
					
						
							| 
									
										
										
										
											2018-01-21 10:32:18 -08:00
										 |  |  |     }, | 
					
						
							|  |  |  |     methods: { | 
					
						
							|  |  |  |       onClickSpoilerButton() { | 
					
						
							| 
									
										
										
										
											2018-01-23 20:56:07 -08:00
										 |  |  |         let statusId = this.get('statusId') | 
					
						
							| 
									
										
										
										
											2018-01-27 18:06:44 -08:00
										 |  |  |         let instanceName = this.store.get('currentInstance') | 
					
						
							|  |  |  |         let $spoilersShown = this.store.get('spoilersShown') || {} | 
					
						
							|  |  |  |         if (!$spoilersShown[instanceName]) { | 
					
						
							|  |  |  |           $spoilersShown[instanceName] = {} | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         $spoilersShown[instanceName][statusId] = !$spoilersShown[instanceName][statusId] | 
					
						
							| 
									
										
										
										
											2018-01-23 20:56:07 -08:00
										 |  |  |         this.store.set({'spoilersShown': $spoilersShown}) | 
					
						
							| 
									
										
										
										
											2018-01-24 19:48:25 -08:00
										 |  |  |         this.hydrateContent() | 
					
						
							| 
									
										
										
										
											2018-01-21 10:32:18 -08:00
										 |  |  |         this.fire('recalculateHeight') | 
					
						
							| 
									
										
										
										
											2018-01-21 12:34:35 -08:00
										 |  |  |       }, | 
					
						
							| 
									
										
										
										
											2018-01-24 19:48:25 -08:00
										 |  |  |       hydrateContent() { | 
					
						
							| 
									
										
										
										
											2018-01-22 21:16:27 -08:00
										 |  |  |         if (!this.refs.contentNode) { | 
					
						
							|  |  |  |           return | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         let status = this.get('originalStatus') | 
					
						
							| 
									
										
										
										
											2018-01-24 19:48:25 -08:00
										 |  |  |         mark('hydrateContent') | 
					
						
							| 
									
										
										
										
											2018-01-22 21:16:27 -08:00
										 |  |  |         if (status.tags && status.tags.length) { | 
					
						
							|  |  |  |           let anchorTags = Array.from(this.refs.contentNode.querySelectorAll( | 
					
						
							|  |  |  |             'a[class~=hashtag][href^=http]')) | 
					
						
							|  |  |  |           for (let tag of status.tags) { | 
					
						
							|  |  |  |             for (let anchorTag of anchorTags) { | 
					
						
							| 
									
										
										
										
											2018-01-24 19:48:25 -08:00
										 |  |  |               if (anchorTag.getAttribute('href').endsWith(`/tags/${tag.name}`)) { | 
					
						
							|  |  |  |                 anchorTag.setAttribute('href', `/tags/${tag.name}`) | 
					
						
							| 
									
										
										
										
											2018-01-22 21:16:27 -08:00
										 |  |  |                 anchorTag.removeAttribute('target') | 
					
						
							|  |  |  |                 anchorTag.removeAttribute('rel') | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-01-24 19:48:25 -08:00
										 |  |  |         if (status.mentions && status.mentions.length) { | 
					
						
							|  |  |  |           let anchorTags = Array.from(this.refs.contentNode.querySelectorAll( | 
					
						
							|  |  |  |             'a[class~=mention][href^=http]')) | 
					
						
							|  |  |  |           for (let mention of status.mentions) { | 
					
						
							|  |  |  |             for (let anchorTag of anchorTags) { | 
					
						
							|  |  |  |               if (anchorTag.getAttribute('href') === mention.url) { | 
					
						
							|  |  |  |                 anchorTag.setAttribute('href', `/accounts/${mention.id}`) | 
					
						
							|  |  |  |                 anchorTag.removeAttribute('target') | 
					
						
							|  |  |  |                 anchorTag.removeAttribute('rel') | 
					
						
							|  |  |  |               } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         stop('hydrateContent') | 
					
						
							| 
									
										
										
										
											2018-01-21 10:32:18 -08:00
										 |  |  |       } | 
					
						
							| 
									
										
										
										
											2018-01-10 21:31:33 -08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-01-10 20:45:02 -08:00
										 |  |  |   } | 
					
						
							|  |  |  | </script> |