1078 lines
		
	
	
		
			28 KiB
		
	
	
	
		
			SCSS
		
	
	
			
		
		
	
	
			1078 lines
		
	
	
		
			28 KiB
		
	
	
	
		
			SCSS
		
	
	
| /*
 | |
| Copyright 2015, 2016 OpenMarket Ltd
 | |
| Copyright 2020-2021 The Matrix.org Foundation C.I.C.
 | |
| 
 | |
| Licensed under the Apache License, Version 2.0 (the "License");
 | |
| you may not use this file except in compliance with the License.
 | |
| You may obtain a copy of the License at
 | |
| 
 | |
|     http://www.apache.org/licenses/LICENSE-2.0
 | |
| 
 | |
| Unless required by applicable law or agreed to in writing, software
 | |
| distributed under the License is distributed on an "AS IS" BASIS,
 | |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
| See the License for the specific language governing permissions and
 | |
| limitations under the License.
 | |
| */
 | |
| 
 | |
| $left-gutter: 64px;
 | |
| $threadInfoLineHeight: calc(2 * $font-12px); // See: _commons.scss
 | |
| 
 | |
| .mx_EventTile {
 | |
|     flex-shrink: 0;
 | |
| 
 | |
|     .mx_EventTile_receiptSent,
 | |
|     .mx_EventTile_receiptSending {
 | |
|         position: relative;
 | |
|         display: inline-block;
 | |
|         width: 16px;
 | |
|         height: 16px;
 | |
| 
 | |
|         &::before {
 | |
|             background-color: $tertiary-content;
 | |
|             mask-repeat: no-repeat;
 | |
|             mask-position: center;
 | |
|             mask-size: 16px;
 | |
|             width: 16px;
 | |
|             height: 16px;
 | |
|             content: '';
 | |
|             position: absolute;
 | |
|             top: 0;
 | |
|             left: 0;
 | |
|             right: 0;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     .mx_EventTile_receiptSent::before {
 | |
|         mask-image: url('$(res)/img/element-icons/circle-sent.svg');
 | |
|     }
 | |
| 
 | |
|     .mx_EventTile_receiptSending::before {
 | |
|         mask-image: url('$(res)/img/element-icons/circle-sending.svg');
 | |
|     }
 | |
| 
 | |
|     .mx_EventTile_content {
 | |
|         &.mx_EditMessageComposer {
 | |
|             // Make sure the formatting bar is visible
 | |
|             overflow: visible;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     .mx_MImageBody {
 | |
|         .mx_MImageBody_thumbnail_container {
 | |
|             display: flex;
 | |
|             align-items: center; // on every layout
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     .mx_ReactionsRow {
 | |
|         display: flex;
 | |
|         flex-flow: wrap;
 | |
|         align-items: center;
 | |
|         gap: $spacing-4;
 | |
|     }
 | |
| 
 | |
|     &[data-layout=group] {
 | |
|         > .mx_DisambiguatedProfile {
 | |
|             line-height: $font-20px;
 | |
|             margin-left: $left-gutter;
 | |
|         }
 | |
| 
 | |
|         > .mx_EventTile_avatar {
 | |
|             position: absolute;
 | |
|             z-index: 9;
 | |
|         }
 | |
| 
 | |
|         .mx_MessageTimestamp {
 | |
|             position: absolute; // for modern layout
 | |
|         }
 | |
| 
 | |
|         .mx_EventTile_line,
 | |
|         .mx_EventTile_reply {
 | |
|             padding-top: 1px;
 | |
|             padding-bottom: 3px;
 | |
|             line-height: $font-22px;
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| .mx_EventTile:not([data-layout=bubble]) {
 | |
|     max-width: 100%;
 | |
|     clear: both;
 | |
|     padding-top: 18px;
 | |
|     font-size: $font-14px;
 | |
|     position: relative;
 | |
| 
 | |
|     .mx_ThreadSummary,
 | |
|     .mx_ThreadSummaryIcon {
 | |
|         margin-left: 64px;
 | |
|     }
 | |
| 
 | |
|     .mx_EventTile_avatar {
 | |
|         top: 14px;
 | |
|         left: 8px;
 | |
|         cursor: pointer;
 | |
|         user-select: none;
 | |
|     }
 | |
| 
 | |
|     &.mx_EventTile_info {
 | |
|         padding-top: 0;
 | |
| 
 | |
|         .mx_EventTile_avatar,
 | |
|         .mx_EventTile_e2eIcon {
 | |
|             margin: 3px 0 2px; // Align with mx_EventTile_line
 | |
|         }
 | |
| 
 | |
|         .mx_EventTile_e2eIcon {
 | |
|             top: 0;
 | |
|         }
 | |
| 
 | |
|         .mx_EventTile_avatar {
 | |
|             top: initial;
 | |
|             inset-inline-start: $left-gutter;
 | |
|             height: 14px;
 | |
|         }
 | |
| 
 | |
|         .mx_EventTile_line {
 | |
|             padding: 3px 0 2px; // Align with mx_EventTile_avatar and mx_EventTile_e2eIcon
 | |
| 
 | |
|             .mx_MessageTimestamp {
 | |
|                 top: 0;
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     &.mx_EventTile_continuation {
 | |
|         padding-top: 0px !important;
 | |
|     }
 | |
| 
 | |
|     .mx_DisambiguatedProfile {
 | |
|         color: $primary-content;
 | |
|         font-size: $font-14px;
 | |
|         display: inline-block;
 | |
|         padding-bottom: 0px;
 | |
|         padding-top: 0px;
 | |
|         max-width: calc(100% - $left-gutter);
 | |
|     }
 | |
| 
 | |
|     &.mx_EventTile_isEditing .mx_MessageTimestamp {
 | |
|         visibility: hidden;
 | |
|     }
 | |
| 
 | |
|     .mx_MessageTimestamp {
 | |
|         display: block;
 | |
|         white-space: nowrap;
 | |
|         left: 0px;
 | |
|         text-align: center;
 | |
|         user-select: none;
 | |
|     }
 | |
| 
 | |
|     &.mx_EventTile_continuation .mx_EventTile_line {
 | |
|         clear: both;
 | |
|     }
 | |
| 
 | |
|     .mx_EventTile_line,
 | |
|     .mx_EventTile_reply {
 | |
|         position: relative;
 | |
|         padding-left: $left-gutter;
 | |
|         border-radius: 8px;
 | |
|     }
 | |
| 
 | |
|     .mx_EventTile_reply {
 | |
|         margin-right: 10px;
 | |
|     }
 | |
| 
 | |
|     /* this is used for the tile for the event which is selected via the URL.
 | |
|      * TODO: ultimately we probably want some transition on here.
 | |
|      */
 | |
|     &.mx_EventTile_isEditing > .mx_EventTile_line,
 | |
|     &.mx_EventTile_selected > .mx_EventTile_line {
 | |
|         box-shadow: inset calc(50px + $selected-message-border-width) 0 0 -50px $accent;
 | |
|         background-color: $event-selected-color;
 | |
|     }
 | |
| 
 | |
|     &.mx_EventTile_highlight,
 | |
|     &.mx_EventTile_highlight .markdown-body {
 | |
|         color: $alert;
 | |
| 
 | |
|         .mx_EventTile_line {
 | |
|             background-color: $event-highlight-bg-color;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     &.mx_EventTile_selected.mx_EventTile_info .mx_EventTile_line {
 | |
|         padding-left: calc($left-gutter + 18px);
 | |
|     }
 | |
| 
 | |
|     &.mx_EventTile:hover .mx_EventTile_line,
 | |
|     &.mx_EventTile.mx_EventTile_actionBarFocused .mx_EventTile_line,
 | |
|     &.mx_EventTile.focus-visible:focus-within .mx_EventTile_line {
 | |
|         background-color: $event-selected-color;
 | |
|     }
 | |
| 
 | |
|     .mx_EventTile_searchHighlight {
 | |
|         background-color: $accent;
 | |
|         color: $accent-fg-color;
 | |
|         border-radius: 5px;
 | |
|         padding-left: 2px;
 | |
|         padding-right: 2px;
 | |
|         cursor: pointer;
 | |
|     }
 | |
| 
 | |
|     .mx_EventTile_searchHighlight a {
 | |
|         background-color: $accent;
 | |
|         color: $accent-fg-color;
 | |
|     }
 | |
| 
 | |
|     &.mx_EventTile_contextual {
 | |
|         opacity: 0.4;
 | |
|     }
 | |
| 
 | |
|     .mx_EventTile_msgOption {
 | |
|         float: right;
 | |
|         text-align: right;
 | |
|         position: relative;
 | |
|         width: 90px;
 | |
| 
 | |
|         /* Hack to stop the height of this pushing the messages apart.
 | |
|            Replaces margin-top: -6px. This interacts better with a read
 | |
|            marker being in between. Content overflows. */
 | |
|         height: 1px;
 | |
| 
 | |
|         margin-right: 10px;
 | |
|     }
 | |
| 
 | |
|     .mx_EventTile_msgOption a {
 | |
|         text-decoration: none;
 | |
|     }
 | |
| 
 | |
|     /* De-zalgoing */
 | |
|     .mx_EventTile_body {
 | |
|         overflow-y: hidden;
 | |
|     }
 | |
| 
 | |
|     &:hover.mx_EventTile_verified .mx_EventTile_line {
 | |
|         box-shadow: inset calc(50px + $selected-message-border-width) 0 0 -50px $e2e-verified-color;
 | |
|     }
 | |
| 
 | |
|     &:hover.mx_EventTile_unverified .mx_EventTile_line {
 | |
|         box-shadow: inset calc(50px + $selected-message-border-width) 0 0 -50px $e2e-unverified-color;
 | |
|     }
 | |
| 
 | |
|     &:hover.mx_EventTile_unknown .mx_EventTile_line {
 | |
|         box-shadow: inset calc(50px + $selected-message-border-width) 0 0 -50px $e2e-unknown-color;
 | |
|     }
 | |
| 
 | |
|     &:hover.mx_EventTile_verified.mx_EventTile_info .mx_EventTile_line,
 | |
|     &:hover.mx_EventTile_unverified.mx_EventTile_info .mx_EventTile_line,
 | |
|     &:hover.mx_EventTile_unknown.mx_EventTile_info .mx_EventTile_line {
 | |
|         padding-left: calc($left-gutter + 18px + $selected-message-border-width);
 | |
|     }
 | |
| 
 | |
|     /* End to end encryption stuff */
 | |
|     &:hover .mx_EventTile_e2eIcon {
 | |
|         opacity: 1;
 | |
|     }
 | |
| 
 | |
|     .mx_MImageBody {
 | |
|         margin-right: 34px;
 | |
| 
 | |
|         .mx_MImageBody_thumbnail_container {
 | |
|             justify-content: flex-start;
 | |
|             min-height: $font-44px;
 | |
|             min-width: $font-44px;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     .mx_EventTile_e2eIcon {
 | |
|         position: absolute;
 | |
|         top: 6px;
 | |
|         left: 44px;
 | |
|         bottom: 0;
 | |
|         right: 0;
 | |
|     }
 | |
| 
 | |
|     .mx_ReactionsRow {
 | |
|         margin: $spacing-4 64px;
 | |
|     }
 | |
| }
 | |
| 
 | |
| .mx_GenericEventListSummary:not([data-layout=bubble]) {
 | |
|     .mx_EventTile_line {
 | |
|         padding-left: $left-gutter;
 | |
| 
 | |
|         .mx_RedactedBody {
 | |
|             line-height: 1; // remove spacing between lines
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| .mx_EventTile:not([data-layout=bubble]).mx_EventTile_info .mx_EventTile_line,
 | |
| .mx_GenericEventListSummary:not([data-layout=bubble]) > .mx_GenericEventListSummary_unstyledList > .mx_EventTile_info .mx_EventTile_avatar ~ .mx_EventTile_line {
 | |
|     padding-left: calc($left-gutter + 20px); // override padding-left $left-gutter
 | |
| }
 | |
| 
 | |
| .mx_EventTile_content {
 | |
|     /*
 | |
|     all the overflow-y: hidden; are to trap Zalgos -
 | |
|     but they introduce an implicit overflow-x: auto.
 | |
|     so make that explicitly hidden too to avoid random
 | |
|     horizontal scrollbars occasionally appearing, like in
 | |
|     https://github.com/vector-im/vector-web/issues/1154
 | |
|     */
 | |
|     overflow-y: hidden;
 | |
|     overflow-x: hidden;
 | |
|     margin-right: 34px;
 | |
| 
 | |
|     .mx_EventTile_edited,
 | |
|     .mx_EventTile_pendingModeration {
 | |
|         user-select: none;
 | |
|         font-size: $font-12px;
 | |
|         color: $roomtopic-color;
 | |
|         display: inline-block;
 | |
|         margin-left: 9px;
 | |
|     }
 | |
| 
 | |
|     .mx_EventTile_edited {
 | |
|         cursor: pointer;
 | |
|     }
 | |
| 
 | |
|     .markdown-body {
 | |
|         font-family: inherit !important;
 | |
|         white-space: normal !important;
 | |
|         line-height: inherit !important;
 | |
|         color: inherit; // inherit the colour from the dark or light theme by default (but not for code blocks)
 | |
|         font-size: $font-14px;
 | |
| 
 | |
|         pre,
 | |
|         code {
 | |
|             font-family: $monospace-font-family !important;
 | |
|             background-color: $codeblock-background-color;
 | |
|         }
 | |
| 
 | |
|         code {
 | |
|             white-space: pre-wrap; // don't collapse spaces in inline code blocks
 | |
|         }
 | |
| 
 | |
|         pre {
 | |
|             // have to use overlay rather than auto otherwise Linux and Windows
 | |
|             // Chrome gets very confused about vertical spacing:
 | |
|             // https://github.com/vector-im/vector-web/issues/754
 | |
|             overflow-x: overlay;
 | |
|             overflow-y: visible;
 | |
| 
 | |
|             &::-webkit-scrollbar-corner {
 | |
|                 background: transparent;
 | |
|             }
 | |
| 
 | |
|             code {
 | |
|                 white-space: pre; // we want code blocks to be scrollable and not wrap
 | |
| 
 | |
|                 > * {
 | |
|                     display: inline;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         h1,
 | |
|         h2,
 | |
|         h3,
 | |
|         h4,
 | |
|         h5,
 | |
|         h6 {
 | |
|             font-family: inherit !important;
 | |
|             color: inherit;
 | |
|         }
 | |
| 
 | |
|         /* Make h1 and h2 the same size as h3. */
 | |
|         h1,
 | |
|         h2 {
 | |
|             font-size: 1.5em;
 | |
|             border-bottom: none !important; // override GFM
 | |
|         }
 | |
| 
 | |
|         a {
 | |
|             color: $accent-alt;
 | |
|         }
 | |
| 
 | |
|         blockquote {
 | |
|             border-left: 2px solid $blockquote-bar-color;
 | |
|             border-radius: 2px;
 | |
|             padding: 0 10px;
 | |
|         }
 | |
| 
 | |
|         /*
 | |
|         // actually, removing the Italic TTF provides
 | |
|         // better results seemingly
 | |
| 
 | |
|         // compensate for Nunito italics being terrible
 | |
|         // https://github.com/google/fonts/issues/1726
 | |
|         em {
 | |
|             transform: skewX(-14deg);
 | |
|             display: inline-block;
 | |
|         }
 | |
|         */
 | |
|     }
 | |
| }
 | |
| 
 | |
| /* Spoiler stuff */
 | |
| .mx_EventTile_spoiler {
 | |
|     cursor: pointer;
 | |
| 
 | |
|     .mx_EventTile_spoiler_reason {
 | |
|         color: $event-timestamp-color;
 | |
|         font-size: $font-11px;
 | |
|     }
 | |
| 
 | |
|     .mx_EventTile_spoiler_content {
 | |
|         filter: blur(5px) saturate(0.1) sepia(1);
 | |
|         transition-duration: 0.5s;
 | |
|     }
 | |
| 
 | |
|     &.visible > .mx_EventTile_spoiler_content {
 | |
|         filter: none;
 | |
|     }
 | |
| }
 | |
| 
 | |
| .mx_RoomView_timeline_rr_enabled {
 | |
|     .mx_EventTile[data-layout=group] {
 | |
| 
 | |
|         .mx_ThreadSummary,
 | |
|         .mx_ThreadSummaryIcon,
 | |
|         .mx_EventTile_line {
 | |
|             /* ideally should be 100px, but 95px gives us a max thumbnail size of 800x600, which is nice */
 | |
|             margin-right: 80px;
 | |
|             min-height: $font-14px;
 | |
|         }
 | |
| 
 | |
|         .mx_ThreadSummary {
 | |
|             max-width: min(calc(100% - $left-gutter - 80px), 600px); // leave space on both left & right gutters
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     // on ELS we need the margin to allow interaction with the expand/collapse button which is normally in the RR gutter
 | |
| }
 | |
| 
 | |
| .mx_EventTile_bubbleContainer {
 | |
|     display: grid;
 | |
|     grid-template-columns: 1fr 100px;
 | |
| 
 | |
|     .mx_EventTile_line {
 | |
|         margin-right: 0;
 | |
|         grid-column: 1 / 3;
 | |
|         // override default padding of mx_EventTile_line so that we can be centered
 | |
|         padding: 0 !important;
 | |
|     }
 | |
| 
 | |
|     .mx_EventTile_msgOption {
 | |
|         grid-column: 2;
 | |
|     }
 | |
| 
 | |
|     &:hover {
 | |
|         .mx_EventTile_line {
 | |
|             // To avoid bubble events being highlighted
 | |
|             background-color: inherit !important;
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| .mx_EventTile_bigEmoji {
 | |
|     font-size: 48px;
 | |
|     line-height: 57px;
 | |
| 
 | |
|     .mx_Emoji {
 | |
|         font-size: inherit !important;
 | |
|     }
 | |
| }
 | |
| 
 | |
| .mx_EventTile_e2eIcon {
 | |
|     position: relative;
 | |
|     width: 14px;
 | |
|     height: 14px;
 | |
|     display: block;
 | |
|     opacity: 0.2;
 | |
|     background-repeat: no-repeat;
 | |
|     background-size: contain;
 | |
| 
 | |
|     &::before,
 | |
|     &::after {
 | |
|         content: "";
 | |
|         display: block;
 | |
|         position: absolute;
 | |
|         top: 0;
 | |
|         bottom: 0;
 | |
|         left: 0;
 | |
|         right: 0;
 | |
|         mask-repeat: no-repeat;
 | |
|         mask-position: center;
 | |
|         mask-size: contain;
 | |
|     }
 | |
| 
 | |
|     &::before {
 | |
|         mask-size: 80%;
 | |
|     }
 | |
| 
 | |
|     &.mx_EventTile_e2eIcon_warning,
 | |
|     &.mx_EventTile_e2eIcon_normal {
 | |
|         opacity: 1;
 | |
|     }
 | |
| 
 | |
|     &.mx_EventTile_e2eIcon_warning::after {
 | |
|         mask-image: url('$(res)/img/e2e/warning.svg');
 | |
|         background-color: $alert;
 | |
|     }
 | |
| 
 | |
|     &.mx_EventTile_e2eIcon_normal::after {
 | |
|         mask-image: url('$(res)/img/e2e/normal.svg');
 | |
|         background-color: $header-panel-text-primary-color;
 | |
|     }
 | |
| }
 | |
| 
 | |
| /* Various markdown overrides */
 | |
| 
 | |
| .mx_EventTile_body {
 | |
|     a:hover {
 | |
|         text-decoration: underline;
 | |
|     }
 | |
| 
 | |
|     pre {
 | |
|         border: 1px solid transparent;
 | |
|     }
 | |
| 
 | |
|     // selector wrongly applies to pill avatars but those have explicit width/height passed at a higher specificity
 | |
|     &.markdown-body img {
 | |
|         object-fit: contain;
 | |
|         object-position: left top;
 | |
|     }
 | |
| }
 | |
| 
 | |
| .mx_EventTile_clamp {
 | |
|     .mx_EventTile_body {
 | |
|         -webkit-line-clamp: 2;
 | |
|         -webkit-box-orient: vertical;
 | |
|         overflow: hidden;
 | |
|         text-overflow: ellipsis;
 | |
|         display: -webkit-box;
 | |
|     }
 | |
| }
 | |
| 
 | |
| .mx_EventTile_lineNumbers {
 | |
|     float: left;
 | |
|     margin: 0 0.5em 0 -1.5em;
 | |
|     color: gray;
 | |
| 
 | |
|     & span {
 | |
|         text-align: right;
 | |
|         display: block;
 | |
|         padding-left: 1em;
 | |
|     }
 | |
| }
 | |
| 
 | |
| .mx_EventTile:hover .mx_EventTile_body pre,
 | |
| .mx_EventTile.focus-visible:focus-within .mx_EventTile_body pre {
 | |
|     border: 1px solid $tertiary-content;
 | |
| }
 | |
| 
 | |
| .mx_EventTile_button {
 | |
|     display: inline-block;
 | |
|     cursor: pointer;
 | |
| }
 | |
| 
 | |
| .mx_EventTile_copyButton {
 | |
|     mask-image: url($copy-button-url);
 | |
| }
 | |
| 
 | |
| .mx_EventTile_collapseButton,
 | |
| .mx_EventTile_expandButton {
 | |
|     mask-position: center;
 | |
|     mask-repeat: no-repeat;
 | |
| }
 | |
| 
 | |
| .mx_EventTile_collapseButton {
 | |
|     mask-image: url("$(res)/img/element-icons/minimise-collapse.svg");
 | |
| }
 | |
| 
 | |
| .mx_EventTile_expandButton {
 | |
|     mask-image: url("$(res)/img/element-icons/maximise-expand.svg");
 | |
| }
 | |
| 
 | |
| .mx_EventTile_body .mx_EventTile_pre_container {
 | |
|     // For correct positioning of _copyButton (See TextualBody)
 | |
|     position: relative;
 | |
| 
 | |
|     &:focus-within,
 | |
|     &:hover {
 | |
|         .mx_EventTile_button {
 | |
|             visibility: visible;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     .mx_EventTile_collapsedCodeBlock {
 | |
|         max-height: 30vh;
 | |
|     }
 | |
| 
 | |
|     // Inserted adjacent to <pre> blocks, (See TextualBody)
 | |
|     .mx_EventTile_button {
 | |
|         position: absolute;
 | |
|         top: 8px;
 | |
|         right: 8px;
 | |
|         width: 19px;
 | |
|         height: 19px;
 | |
|         visibility: hidden;
 | |
|         background-color: $message-action-bar-fg-color;
 | |
| 
 | |
|         &.mx_EventTile_buttonBottom {
 | |
|             top: 33px;
 | |
|         }
 | |
| 
 | |
|         &.mx_EventTile_collapseButton,
 | |
|         &.mx_EventTile_expandButton {
 | |
|             mask-size: 75%;
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| /* end of overrides */
 | |
| 
 | |
| .mx_EventTile_keyRequestInfo {
 | |
|     font-size: $font-12px;
 | |
| 
 | |
|     .mx_EventTile_keyRequestInfo_text {
 | |
|         opacity: 0.5;
 | |
| 
 | |
|         .mx_AccessibleButton {
 | |
|             color: $primary-content;
 | |
|             text-decoration: underline;
 | |
| 
 | |
|             &.mx_AccessibleButton_kind_link_inline {
 | |
|                 padding: 0;
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| .mx_EventTile_keyRequestInfo_tooltip_contents p {
 | |
|     text-align: auto;
 | |
|     margin-left: 3px;
 | |
|     margin-right: 3px;
 | |
| 
 | |
|     &:first-child {
 | |
|         margin-top: 0px;
 | |
|     }
 | |
| 
 | |
|     &:last-child {
 | |
|         margin-bottom: 0px;
 | |
|     }
 | |
| }
 | |
| 
 | |
| .mx_EventTile_tileError {
 | |
|     color: red;
 | |
|     text-align: center;
 | |
| 
 | |
|     // Remove some of the default tile padding so that the error is centered
 | |
|     margin-right: 0;
 | |
| 
 | |
|     .mx_EventTile_line {
 | |
|         padding-left: 0;
 | |
|         margin-right: 0;
 | |
|     }
 | |
| 
 | |
|     .mx_EventTile_line span {
 | |
|         padding: 4px 8px;
 | |
|     }
 | |
| 
 | |
|     a {
 | |
|         margin-left: 1em;
 | |
|     }
 | |
| }
 | |
| 
 | |
| .mx_EventTile:hover .mx_MessageActionBar,
 | |
| .mx_EventTile.mx_EventTile_actionBarFocused .mx_MessageActionBar,
 | |
| [data-whatinput='keyboard'] .mx_EventTile:focus-within .mx_MessageActionBar,
 | |
| .mx_EventTile.focus-visible:focus-within .mx_MessageActionBar {
 | |
|     visibility: visible;
 | |
| }
 | |
| 
 | |
| // Inverse of the above to *disable* the animation on any indicators. This approach
 | |
| // is less pretty, but is easier to target because otherwise we need to define the
 | |
| // animation for when it's shown which means duplicating the style definition in
 | |
| // multiple places.
 | |
| .mx_EventTile:not(:hover):not(.mx_EventTile_actionBarFocused):not([data-whatinput='keyboard'] :focus-within):not(.focus-visible:focus-within) {
 | |
|     .mx_MessageActionBar .mx_Indicator {
 | |
|         animation: none;
 | |
|     }
 | |
| }
 | |
| 
 | |
| .mx_ThreadPanel_replies::before,
 | |
| .mx_ThreadSummaryIcon::before,
 | |
| .mx_ThreadSummary::before {
 | |
|     @mixin ThreadInfoIcon;
 | |
|     background-color: $secondary-content !important;
 | |
| }
 | |
| 
 | |
| .mx_ThreadSummaryIcon {
 | |
|     display: inline-block;
 | |
|     font-size: $font-12px;
 | |
|     color: $secondary-content !important;
 | |
|     margin-top: 8px;
 | |
|     margin-bottom: 8px;
 | |
| 
 | |
|     &::before {
 | |
|         vertical-align: middle;
 | |
|         margin-right: 8px;
 | |
|         margin-top: -2px;
 | |
|     }
 | |
| }
 | |
| 
 | |
| .mx_MessagePanel_narrow .mx_ThreadSummary {
 | |
|     min-width: initial;
 | |
|     max-width: 100%; // prevent overflow
 | |
|     width: initial;
 | |
| }
 | |
| 
 | |
| .mx_EventTile[data-shape=ThreadsList] {
 | |
|     --topOffset: $spacing-12;
 | |
|     --leftOffset: 48px;
 | |
|     $borderRadius: 8px;
 | |
|     $padding: $spacing-8;
 | |
|     $hrHeight: 1px;
 | |
|     $notification-dot-size: 8px; // notification dot next to the timestamp
 | |
| 
 | |
|     margin: calc(var(--topOffset) + $hrHeight) 0 var(--topOffset); // include the height of horizontal line
 | |
|     padding: $padding $spacing-24 $padding $padding;
 | |
|     border-radius: $borderRadius;
 | |
| 
 | |
|     display: flex;
 | |
|     flex-flow: wrap;
 | |
|     align-items: center;
 | |
| 
 | |
|     &:hover,
 | |
|     // Override .mx_EventTile:not([data-layout=bubble]).mx_EventTile:hover .mx_EventTile_line
 | |
|     &:not([data-layout=bubble]):hover .mx_EventTile_line {
 | |
|         background-color: $system;
 | |
|     }
 | |
| 
 | |
|     &:not([data-layout=bubble]):hover .mx_EventTile_line {
 | |
|         box-shadow: none; // don't show the verification left stroke in the thread list
 | |
|     }
 | |
| 
 | |
|     &::after,
 | |
|     &::before {
 | |
|         content: "";
 | |
|         position: absolute;
 | |
|     }
 | |
| 
 | |
|     &::after {
 | |
|         $inset-block-start: auto;
 | |
|         $inset-inline-end: calc(32px - $padding);
 | |
|         $inset-block-end: calc(-1 * var(--topOffset) - $hrHeight); // exclude the height of horizontal line
 | |
|         $inset-inline-start: calc(var(--leftOffset) + $padding);
 | |
|         inset: $inset-block-start $inset-inline-end $inset-block-end $inset-inline-start;
 | |
| 
 | |
|         height: $hrHeight;
 | |
|         background-color: $quinary-content;
 | |
|         pointer-events: none; // disable the message action bar on hover
 | |
|     }
 | |
| 
 | |
|     &::before {
 | |
|         inset: 0;
 | |
|     }
 | |
| 
 | |
|     // Display notification dot
 | |
|     &[data-notification]::before {
 | |
|         width: $notification-dot-size;
 | |
|         height: $notification-dot-size;
 | |
|         border-radius: 50%;
 | |
|         inset: 14px $spacing-8 auto auto; // 14px: align the dot with the timestamp row
 | |
|     }
 | |
| 
 | |
|     &[data-notification=total]::before {
 | |
|         background-color: $room-icon-unread-color;
 | |
|     }
 | |
| 
 | |
|     &[data-notification=highlight]::before {
 | |
|         background-color: $alert;
 | |
|     }
 | |
| 
 | |
|     &:last-child {
 | |
|         &::after {
 | |
|             content: unset;
 | |
|         }
 | |
| 
 | |
|         margin-bottom: 0;
 | |
|     }
 | |
| 
 | |
|     &:first-child {
 | |
|         margin-top: 0;
 | |
|     }
 | |
| 
 | |
|     .mx_EventTile_avatar {
 | |
|         inset: $padding auto auto $padding;
 | |
|     }
 | |
| 
 | |
|     .mx_DisambiguatedProfile {
 | |
|         margin-inline: 0 $spacing-12;
 | |
|         display: inline-flex;
 | |
|         flex: 1;
 | |
| 
 | |
|         .mx_DisambiguatedProfile_displayName,
 | |
|         .mx_DisambiguatedProfile_mxid {
 | |
|             display: block;
 | |
|             overflow: hidden;
 | |
|             text-overflow: ellipsis;
 | |
|         }
 | |
| 
 | |
|         .mx_DisambiguatedProfile_displayName {
 | |
|             flex: none;
 | |
|             max-width: 100%;
 | |
|         }
 | |
| 
 | |
|         .mx_DisambiguatedProfile_mxid {
 | |
|             flex: 1;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     .mx_EventTile_line {
 | |
|         width: 100%;
 | |
|         box-sizing: border-box;
 | |
|         padding-bottom: 0;
 | |
| 
 | |
|         .mx_ThreadPanel_replies {
 | |
|             margin-top: $spacing-8;
 | |
|             display: flex;
 | |
|             align-items: center;
 | |
|             position: relative;
 | |
| 
 | |
|             .mx_ThreadPanel_replies_amount {
 | |
|                 @mixin ThreadsAmount;
 | |
|                 font-size: $font-12px; // Same font size as the counter on the main panel
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     .mx_DisambiguatedProfile,
 | |
|     .mx_EventTile_line {
 | |
|         padding-inline-start: var(--leftOffset);
 | |
|     }
 | |
| 
 | |
|     .mx_MessageTimestamp {
 | |
|         max-width: 80px;
 | |
|         width: auto;
 | |
|         position: initial;
 | |
|     }
 | |
| }
 | |
| 
 | |
| // For style rules of ThreadView, see _ThreadPanel.scss
 | |
| .mx_ThreadView {
 | |
|     --ThreadView_group_spacing-start: 56px; // 56px: 64px - 8px (padding)
 | |
|     --ThreadView_group_spacing-end: 8px; // same as padding
 | |
| 
 | |
|     .mx_EventTile {
 | |
|         display: flex;
 | |
|         flex-direction: column;
 | |
| 
 | |
|         .mx_EventTile_roomName {
 | |
|             display: none;
 | |
|         }
 | |
| 
 | |
|         .mx_EventTile_line {
 | |
|             padding-top: var(--BaseCard_EventTile_line-padding-block);
 | |
|             padding-bottom: var(--BaseCard_EventTile_line-padding-block);
 | |
|         }
 | |
| 
 | |
|         .mx_EventTile_line,
 | |
|         .mx_ReactionsRow {
 | |
|             padding-inline-start: 0; // Cancel inherited padding value for event message and reactions row
 | |
|         }
 | |
| 
 | |
|         .mx_ReactionsRow {
 | |
|             padding-inline-end: 0;
 | |
|         }
 | |
| 
 | |
|         .mx_MessageTimestamp {
 | |
|             font-size: $font-10px;
 | |
|         }
 | |
| 
 | |
|         // handling for hidden events (e.g reactions) in the thread view
 | |
|         &.mx_EventTile_info {
 | |
|             padding-top: 0;
 | |
| 
 | |
|             .mx_EventTile_avatar {
 | |
|                 position: absolute;
 | |
|                 top: 1.5px; // Align with hidden event content
 | |
|                 margin-top: 0;
 | |
|                 margin-bottom: 0;
 | |
|                 width: 14px; // avatar img size
 | |
|                 height: 14px; // avatar img size
 | |
|             }
 | |
| 
 | |
|             .mx_ViewSourceEvent_toggle {
 | |
|                 display: none; // hide the hidden event expand button, not enough space, view source can still be used
 | |
|             }
 | |
| 
 | |
|             &.mx_EventTile_selected .mx_EventTile_line,
 | |
|             .mx_EventTile_line {
 | |
|                 $line-height: $font-12px;
 | |
| 
 | |
|                 padding-inline-start: 0;
 | |
|                 line-height: $line-height;
 | |
| 
 | |
|                 .mx_EventTile_content,
 | |
|                 .mx_RedactedBody {
 | |
|                     width: auto;
 | |
|                     margin-inline-start: calc(var(--ThreadView_group_spacing-start) + 14px + 6px); // 14px: avatar width, 6px: 20px - 14px
 | |
|                     font-size: $line-height;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             &:not([data-layout=bubble]) {
 | |
|                 .mx_MessageTimestamp {
 | |
|                     top: 2px; // Align with avatar
 | |
|                 }
 | |
| 
 | |
|                 .mx_EventTile_avatar {
 | |
|                     left: calc($MessageTimestamp_width + 14px - 4px); // 14px: avatar width, 4px: align with text
 | |
|                     z-index: 9; // position above the hover styling
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             &[data-layout=bubble] {
 | |
|                 .mx_EventTile_avatar {
 | |
|                     inset-inline-start: 0;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         &:not([data-layout=bubble]) {
 | |
|             padding-top: $spacing-16;
 | |
| 
 | |
|             &:hover.mx_EventTile_verified.mx_EventTile_info .mx_EventTile_line,
 | |
|             &:hover.mx_EventTile_unverified.mx_EventTile_info .mx_EventTile_line,
 | |
|             &:hover.mx_EventTile_unknown.mx_EventTile_info .mx_EventTile_line {
 | |
|                 padding-inline-start: 0; // Override
 | |
|             }
 | |
| 
 | |
|             .mx_EventTile_line {
 | |
|                 padding-top: var(--BaseCard_EventTile_line-padding-block);
 | |
|                 padding-bottom: var(--BaseCard_EventTile_line-padding-block);
 | |
| 
 | |
|                 .mx_EventTile_content {
 | |
|                     &.mx_EditMessageComposer {
 | |
|                         padding-inline-start: 0; // align start of first letter with that of the event body
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         &[data-layout=bubble] {
 | |
|             margin-inline-start: var(--BaseCard_EventTile-spacing-inline);
 | |
|             margin-inline-end: var(--BaseCard_EventTile-spacing-inline);
 | |
| 
 | |
|             &::before {
 | |
|                 inset-inline: calc(-1 * var(--BaseCard_EventTile-spacing-inline));
 | |
|                 z-index: auto; // enable background color on hover
 | |
|             }
 | |
| 
 | |
|             .mx_ReactionsRow {
 | |
|                 position: relative; // display on hover
 | |
|             }
 | |
| 
 | |
|             .mx_EventTile_line.mx_EventTile_mediaLine {
 | |
|                 padding-block: 0;
 | |
|                 padding-inline-start: 0;
 | |
|                 max-width: var(--EventBubbleTile_line-max-width);
 | |
|             }
 | |
| 
 | |
|             &[data-self=true] {
 | |
|                 align-items: flex-end;
 | |
| 
 | |
|                 .mx_EventTile_line.mx_EventTile_mediaLine {
 | |
|                     margin: 0 var(--EventTile_bubble_line-margin-inline-end) 0 0; // align with normal messages
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         &[data-layout=group] {
 | |
|             width: 100%;
 | |
| 
 | |
|             .mx_EventTile_content,
 | |
|             .mx_HiddenBody,
 | |
|             .mx_RedactedBody,
 | |
|             .mx_UnknownBody,
 | |
|             .mx_MPollBody,
 | |
|             .mx_MLocationBody,
 | |
|             .mx_ReplyChain_wrapper,
 | |
|             .mx_ReactionsRow {
 | |
|                 margin-inline-start: var(--ThreadView_group_spacing-start);
 | |
|                 margin-inline-end: var(--ThreadView_group_spacing-end);
 | |
| 
 | |
|                 .mx_EventTile_content,
 | |
|                 .mx_HiddenBody,
 | |
|                 .mx_RedactedBody,
 | |
|                 .mx_MImageBody {
 | |
|                     margin: 0;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             .mx_ReplyChain_wrapper {
 | |
|                 .mx_MLocationBody,
 | |
|                 .mx_UnknownBody { // Error message inside ReplyTile
 | |
|                     margin-inline: unset;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             .mx_EventTile_mediaLine {
 | |
|                 // such as MImageBody
 | |
|                 > div,
 | |
|                 > span {
 | |
|                     margin-inline-start: var(--ThreadView_group_spacing-start);
 | |
|                     margin-inline-end: var(--ThreadView_group_spacing-end);
 | |
|                 }
 | |
| 
 | |
|                 // such as MAudioBody and MFileBody
 | |
|                 > span {
 | |
|                     display: block; // Apply the margin declarations to span element
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             .mx_MessageTimestamp {
 | |
|                 top: 2px; // Align with mx_EventTile_content
 | |
|             }
 | |
| 
 | |
|             .mx_EventTile_senderDetails {
 | |
|                 display: flex;
 | |
|                 align-items: center;
 | |
|                 gap: $spacing-16; // gap between the avatar and the sender ID
 | |
|                 padding-inline-start: $spacing-8;
 | |
| 
 | |
|                 a {
 | |
|                     flex: 1;
 | |
|                     min-width: unset;
 | |
|                     max-width: 100%;
 | |
|                     display: flex;
 | |
|                     align-items: center;
 | |
| 
 | |
|                     .mx_DisambiguatedProfile {
 | |
|                         margin-left: 8px;
 | |
|                         flex: 1;
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     .mx_GenericEventListSummary {
 | |
|         &:not([data-layout=bubble]) > .mx_EventTile_line {
 | |
|             padding-inline-start: var(--ThreadView_group_spacing-start); // align summary text with message text
 | |
|             padding-inline-end: var(--ThreadView_group_spacing-end); // align summary text with message text
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| // Media query for mobile UI
 | |
| @media only screen and (max-width: 480px) {
 | |
|     .mx_EventTile_content {
 | |
|         margin-right: 0;
 | |
|     }
 | |
| }
 |