mirror of
https://github.com/vector-im/element-web.git
synced 2026-05-08 05:36:13 +02:00
Three problems prevented the document editor from being usable: 1. The contentEditable div inherited composer sizing (~22px tall) so clicks in the document content area landed outside it and bubbled up to the mx_RoomView div[tabIndex=-1], making the whole room view flash blue instead of focusing the editor. Fixed by making the Editor stack fill the full content area height in _DocumentView.pcss. 2. useSetCursorPosition was not called, so even when the editor received focus there was no selection range and no visible cursor. Added the hook call (same pattern as WysiwygComposer). 3. Any click outside the now-tall contentEditable div (e.g. in padding) still fell through. Added an onClick handler on the content wrapper that calls ref.current.focus() when the click target isn't the editor itself, ensuring any click in the document area focuses the editor. Bonus: suppress the browser default outline on .mx_RoomView:focus so pressing a key no longer shows a blue box around the entire room view. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
213 lines
4.4 KiB
Plaintext
213 lines
4.4 KiB
Plaintext
/*
|
|
Copyright 2024 New Vector Ltd.
|
|
Copyright 2015, 2016 OpenMarket Ltd
|
|
|
|
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial
|
|
Please see LICENSE files in the repository root for full details.
|
|
*/
|
|
|
|
:root {
|
|
--RoomView_MessageList-padding: 18px;
|
|
}
|
|
|
|
.mx_RoomView_wrapper {
|
|
display: flex;
|
|
flex-direction: column;
|
|
flex: 1;
|
|
position: relative;
|
|
justify-content: center;
|
|
/* Contain the amount of layers rendered by constraining what actually needs re-layering via css */
|
|
contain: strict;
|
|
}
|
|
|
|
.mx_RoomView {
|
|
word-wrap: break-word;
|
|
display: flex;
|
|
flex-direction: column;
|
|
flex: 1;
|
|
position: relative;
|
|
|
|
/* The outer div has tabIndex=-1 for keyboard shortcuts. Suppress the
|
|
* browser's default focus outline — the editor's own outline is sufficient. */
|
|
&:focus {
|
|
outline: none;
|
|
}
|
|
.mx_MainSplit {
|
|
flex: 1 1 0;
|
|
}
|
|
|
|
.mx_MessageComposer {
|
|
width: 100%;
|
|
flex: 0 0 auto;
|
|
margin-right: 2px;
|
|
padding-bottom: 1em;
|
|
}
|
|
}
|
|
|
|
.mx_RoomView_auxPanel_hiddenHighlights {
|
|
border-bottom: 1px solid $primary-hairline-color;
|
|
padding: 10px 26px;
|
|
color: $alert;
|
|
cursor: pointer;
|
|
}
|
|
|
|
.mx_RoomView_messagePanel {
|
|
width: 100%;
|
|
overflow-y: auto;
|
|
flex: 1 1 0;
|
|
overflow-anchor: none;
|
|
}
|
|
|
|
.mx_RoomView_messagePanelSearchSpinner {
|
|
flex: 1;
|
|
background-image: url("/res/img/typing-indicator-2x.gif");
|
|
background-position: center 367px;
|
|
background-size: 25px;
|
|
background-repeat: no-repeat;
|
|
position: relative;
|
|
|
|
svg {
|
|
color: $info-plinth-fg-color;
|
|
width: 50px;
|
|
height: 50px;
|
|
position: absolute;
|
|
top: 286px;
|
|
left: calc(50% - 25px);
|
|
}
|
|
}
|
|
|
|
.mx_RoomView_body {
|
|
display: flex;
|
|
flex-direction: column;
|
|
flex: 1;
|
|
min-width: 0;
|
|
container-type: size;
|
|
container-name: roomview;
|
|
|
|
.mx_RoomView_messagePanel,
|
|
.mx_RoomView_messagePanelSpinner,
|
|
.mx_RoomView_messagePanelSearchSpinner {
|
|
order: 2;
|
|
}
|
|
|
|
.mx_RoomView_timeline {
|
|
/* offset parent for mx_RoomView_topUnreadMessagesBar */
|
|
position: relative;
|
|
flex: 1;
|
|
display: flex;
|
|
flex-direction: column;
|
|
margin-right: calc(var(--container-gap-width) / 2);
|
|
}
|
|
}
|
|
|
|
.mx_RoomView_statusArea {
|
|
width: 100%;
|
|
flex: 0 0 auto;
|
|
|
|
max-height: 0px;
|
|
background-color: $background;
|
|
z-index: 1000;
|
|
overflow: hidden;
|
|
|
|
transition: all 0.2s ease-out;
|
|
}
|
|
|
|
.mx_RoomView_statusArea_expanded {
|
|
max-height: 100px;
|
|
}
|
|
|
|
.mx_RoomView_statusAreaBox {
|
|
margin: auto;
|
|
min-height: 50px;
|
|
}
|
|
|
|
.mx_RoomView_statusAreaBox_line {
|
|
margin-left: 65px;
|
|
border-top: 1px solid $primary-hairline-color;
|
|
height: 1px;
|
|
}
|
|
|
|
.mx_RoomView_messageListWrapper {
|
|
display: flex;
|
|
flex-direction: column;
|
|
justify-content: flex-end;
|
|
position: relative;
|
|
}
|
|
|
|
.mx_RoomView_searchResultsPanel {
|
|
.mx_RoomView_messageListWrapper {
|
|
justify-content: flex-start;
|
|
|
|
> .mx_RoomView_MessageList > li > ol {
|
|
list-style-type: none;
|
|
}
|
|
}
|
|
|
|
a {
|
|
text-decoration: none;
|
|
color: inherit;
|
|
}
|
|
}
|
|
|
|
.mx_RoomView_empty {
|
|
font-size: $font-13px;
|
|
padding: 0 24px;
|
|
margin-right: 30px;
|
|
text-align: center;
|
|
margin-bottom: 80px; /* visually center the content (intentional offset) */
|
|
}
|
|
|
|
.mx_RoomView_MessageList {
|
|
list-style-type: none;
|
|
padding: var(--RoomView_MessageList-padding); /* mx_ProfileResizer depends on this value */
|
|
margin: 0;
|
|
/* needed as min-height is set to clientHeight in ScrollPanel
|
|
to prevent shrinking when WhoIsTypingTile is hidden */
|
|
box-sizing: border-box;
|
|
|
|
li {
|
|
clear: both;
|
|
}
|
|
|
|
.mx_ScrollPanel & {
|
|
position: relative;
|
|
display: flex;
|
|
flex-direction: column;
|
|
justify-content: flex-end;
|
|
|
|
content-visibility: auto;
|
|
contain-intrinsic-size: 50px;
|
|
}
|
|
|
|
.mx_RoomView--local .mx_ScrollPanel & {
|
|
justify-content: center;
|
|
}
|
|
}
|
|
|
|
.mx_RoomView_inCall {
|
|
.mx_RoomView_statusAreaBox_line {
|
|
margin-top: 2px;
|
|
border: none;
|
|
height: 0px;
|
|
}
|
|
|
|
.mx_MessageComposer_wrapper {
|
|
border-top: 2px hidden;
|
|
padding-top: 1px;
|
|
}
|
|
}
|
|
|
|
.mx_MatrixChat_useCompactLayout {
|
|
.mx_RoomView_MessageList {
|
|
margin-bottom: 4px;
|
|
|
|
h2 {
|
|
margin-top: 6px;
|
|
}
|
|
}
|
|
|
|
.mx_RoomView_statusAreaBox {
|
|
min-height: 42px;
|
|
}
|
|
}
|