mirror of https://github.com/vector-im/riot-web
Improved message bubble layout (no reply)
parent
6b9dfa37c5
commit
d1c6cfe6b9
|
@ -27,6 +27,7 @@ limitations under the License.
|
||||||
// https://bugzilla.mozilla.org/show_bug.cgi?id=255139
|
// https://bugzilla.mozilla.org/show_bug.cgi?id=255139
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
user-select: none;
|
user-select: none;
|
||||||
|
line-height: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
.mx_BaseAvatar_initial {
|
.mx_BaseAvatar_initial {
|
||||||
|
|
|
@ -36,34 +36,24 @@ limitations under the License.
|
||||||
.mx_EventTile_line {
|
.mx_EventTile_line {
|
||||||
width: fit-content;
|
width: fit-content;
|
||||||
max-width: 70%;
|
max-width: 70%;
|
||||||
background: var(--backgroundColor);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.mx_SenderProfile {
|
.mx_SenderProfile {
|
||||||
display: none;
|
|
||||||
padding: var(--gutterSize) var(--gutterSize) 0 var(--gutterSize);
|
padding: var(--gutterSize) var(--gutterSize) 0 var(--gutterSize);
|
||||||
border-top-left-radius: var(--cornerRadius);
|
|
||||||
border-top-right-radius: var(--cornerRadius);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.mx_EventTile_line {
|
.mx_EventTile_line {
|
||||||
padding: var(--gutterSize);
|
padding: var(--gutterSize);
|
||||||
border-radius: var(--cornerRadius);
|
border-radius: var(--cornerRadius);
|
||||||
|
background: var(--backgroundColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
.mx_SenderProfile + .mx_EventTile_line {
|
|
||||||
padding-top: 0;
|
|
||||||
border-top-left-radius: 0;
|
|
||||||
border-top-right-radius: 0;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
.mx_EventTile_avatar {
|
.mx_EventTile_avatar {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 0;
|
top: 0;
|
||||||
|
line-height: 1;
|
||||||
img {
|
img {
|
||||||
border: 2px solid #fff;
|
box-shadow: 0 0 0 2px #fff;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -72,6 +62,9 @@ limitations under the License.
|
||||||
.mx_EventTile_line {
|
.mx_EventTile_line {
|
||||||
float: right;
|
float: right;
|
||||||
}
|
}
|
||||||
|
.mx_SenderProfile {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
.mx_ReactionsRow {
|
.mx_ReactionsRow {
|
||||||
float: right;
|
float: right;
|
||||||
clear: right;
|
clear: right;
|
||||||
|
@ -88,6 +81,22 @@ limitations under the License.
|
||||||
--backgroundColor: #F8FDFC;
|
--backgroundColor: #F8FDFC;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&[data-has-reply=true] {
|
||||||
|
> .mx_EventTile_line {
|
||||||
|
flex-direction: column;
|
||||||
|
|
||||||
|
> a {
|
||||||
|
margin-top: -12px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.mx_ReplyThread_show {
|
||||||
|
order: 99999;
|
||||||
|
background: white;
|
||||||
|
box-shadow: 0 0 0 var(--gutterSize) white;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
&:not([data-self=true]) {
|
&:not([data-self=true]) {
|
||||||
.mx_EventTile_avatar {
|
.mx_EventTile_avatar {
|
||||||
left: calc(-1 * var(--avatarSize));
|
left: calc(-1 * var(--avatarSize));
|
||||||
|
@ -100,6 +109,7 @@ limitations under the License.
|
||||||
& ~ .mx_EventListSummary[data-expanded=false] {
|
& ~ .mx_EventListSummary[data-expanded=false] {
|
||||||
|
|
||||||
--backgroundColor: transparent;
|
--backgroundColor: transparent;
|
||||||
|
--gutterSize: 0;
|
||||||
|
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
@ -140,10 +150,25 @@ limitations under the License.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Special layout scenario for "Unable To Decrypt (UTD)" events */
|
||||||
|
&.mx_EventTile_bad > .mx_EventTile_line {
|
||||||
|
flex-direction: column;
|
||||||
|
> a {
|
||||||
|
position: absolute;
|
||||||
|
bottom: var(--gutterSize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
.mx_EventTile_readAvatars {
|
.mx_EventTile_readAvatars {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
right: 0;
|
right: 0;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.mx_MTextBody {
|
||||||
|
/* 30px equates to the width of the timestamp */
|
||||||
|
max-width: calc(100% - 35px - var(--gutterSize));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -372,26 +372,6 @@ $hover-select-border: 4px;
|
||||||
left: 41px;
|
left: 41px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.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_MImageBody {
|
.mx_MImageBody {
|
||||||
margin-right: 34px;
|
margin-right: 34px;
|
||||||
}
|
}
|
||||||
|
@ -626,6 +606,26 @@ $hover-select-border: 4px;
|
||||||
margin-bottom: 0px;
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@media only screen and (max-width: 480px) {
|
@media only screen and (max-width: 480px) {
|
||||||
.mx_EventTile_line, .mx_EventTile_reply {
|
.mx_EventTile_line, .mx_EventTile_reply {
|
||||||
padding-left: 0;
|
padding-left: 0;
|
||||||
|
|
|
@ -163,8 +163,6 @@ export function getHandlerTile(ev) {
|
||||||
return eventTileTypes[type];
|
return eventTileTypes[type];
|
||||||
}
|
}
|
||||||
|
|
||||||
const MAX_READ_AVATARS = 5;
|
|
||||||
|
|
||||||
// Our component structure for EventTiles on the timeline is:
|
// Our component structure for EventTiles on the timeline is:
|
||||||
//
|
//
|
||||||
// .-EventTile------------------------------------------------.
|
// .-EventTile------------------------------------------------.
|
||||||
|
@ -649,6 +647,10 @@ export default class EventTile extends React.Component<IProps, IState> {
|
||||||
return <SentReceipt messageState={this.props.mxEvent.getAssociatedStatus()} />;
|
return <SentReceipt messageState={this.props.mxEvent.getAssociatedStatus()} />;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const MAX_READ_AVATARS = this.props.layout == Layout.Bubble
|
||||||
|
? 2
|
||||||
|
: 5;
|
||||||
|
|
||||||
// return early if there are no read receipts
|
// return early if there are no read receipts
|
||||||
if (!this.props.readReceipts || this.props.readReceipts.length === 0) {
|
if (!this.props.readReceipts || this.props.readReceipts.length === 0) {
|
||||||
// We currently must include `mx_EventTile_readAvatars` in the DOM
|
// We currently must include `mx_EventTile_readAvatars` in the DOM
|
||||||
|
@ -1194,6 +1196,7 @@ export default class EventTile extends React.Component<IProps, IState> {
|
||||||
"data-scroll-tokens": scrollToken,
|
"data-scroll-tokens": scrollToken,
|
||||||
"data-layout": this.props.layout,
|
"data-layout": this.props.layout,
|
||||||
"data-self": isOwnEvent,
|
"data-self": isOwnEvent,
|
||||||
|
"data-has-reply": !!thread,
|
||||||
"onMouseEnter": () => this.setState({ hover: true }),
|
"onMouseEnter": () => this.setState({ hover: true }),
|
||||||
"onMouseLeave": () => this.setState({ hover: false }),
|
"onMouseLeave": () => this.setState({ hover: false }),
|
||||||
}, [
|
}, [
|
||||||
|
|
Loading…
Reference in New Issue