diff --git a/res/css/views/rooms/_EventTile.scss b/res/css/views/rooms/_EventTile.scss index 3acebd03e9..2d986a6fc6 100644 --- a/res/css/views/rooms/_EventTile.scss +++ b/res/css/views/rooms/_EventTile.scss @@ -516,41 +516,28 @@ $left-gutter: 64px; } // Inserted adjacent to
blocks, (See TextualBody) -.mx_EventTile_copyButton { +.mx_EventTile_button { position: absolute; display: inline-block; visibility: hidden; cursor: pointer; - top: 31px; + top: 6px; right: 6px; width: 19px; height: 19px; - mask-image: url($copy-button-url); background-color: $message-action-bar-fg-color; } +.mx_EventTile_buttonBottom { + top: 31px; +} +.mx_EventTile_copyButton { + mask-image: url($copy-button-url); +} .mx_EventTile_collapseButton { - position: absolute; - display: inline-block; - visibility: hidden; - cursor: pointer; - top: 6px; - right: 6px; - width: 19px; - height: 19px; mask-image: url($collapse-button-url); - background-color: $message-action-bar-fg-color; } .mx_EventTile_expandButton { - position: absolute; - display: inline-block; - visibility: hidden; - cursor: pointer; - top: 6px; - right: 6px; - width: 19px; - height: 19px; mask-image: url($expand-button-url); - background-color: $message-action-bar-fg-color; } .mx_EventTile_body .mx_EventTile_pre_container:focus-within .mx_EventTile_copyButton, diff --git a/src/components/views/messages/TextualBody.js b/src/components/views/messages/TextualBody.js index 511ea61904..da6aaa2830 100644 --- a/src/components/views/messages/TextualBody.js +++ b/src/components/views/messages/TextualBody.js @@ -99,8 +99,8 @@ export default class TextualBody extends React.Component { * when theoverflows and is scrolled horizontally. */ const div = this._wrapInDiv(pres[i]); this._handleCodeBlockExpansion(pres[i]); - this._addCodeCopyButton(div); this._addCodeExpansionButton(div, pres[i]); + this._addCodeCopyButton(div); } } // Highlight code @@ -121,22 +121,28 @@ export default class TextualBody extends React.Component { } _addCodeExpansionButton(div, pre) { - // TODO: What if the block is small and the we don't need the icon? + /* Calculate how many percent does the pre element take up. + * If it's less than 30% we don't add the expansion button. */ + const percentageOfViewport = pre.offsetHeight / window.innerHeight * 100; + console.log("expansionButtonExists", percentageOfViewport); + if (percentageOfViewport < 30) return; const button = document.createElement("span"); + button.className = "mx_EventTile_button "; if (pre.className == "mx_EventTile_collapsedCodeBlock") { - button.className = "mx_EventTile_expandButton"; + button.className += "mx_EventTile_expandButton"; } else { - button.className = "mx_EventTile_collapseButton"; + button.className += "mx_EventTile_collapseButton"; } button.onclick = async () => { + button.className = "mx_EventTile_button "; if (pre.className == "mx_EventTile_collapsedCodeBlock") { pre.className = ""; - button.className = "mx_EventTile_collapseButton"; + button.className += "mx_EventTile_collapseButton"; } else { pre.className = "mx_EventTile_collapsedCodeBlock"; - button.className = "mx_EventTile_expandButton"; + button.className += "mx_EventTile_expandButton"; } }; @@ -145,7 +151,13 @@ export default class TextualBody extends React.Component { _addCodeCopyButton(div) { const button = document.createElement("span"); - button.className = "mx_EventTile_copyButton"; + button.className = "mx_EventTile_button mx_EventTile_copyButton "; + + /* Check if expansion button exists. If so + * we put the copy button to the bottom */ + const expansionButtonExists = div.getElementsByClassName("mx_EventTile_button"); + if (expansionButtonExists.length > 0) button.className += "mx_EventTile_buttonBottom"; + button.onclick = async () => { const copyCode = button.parentNode.getElementsByTagName("pre")[0]; const successful = await copyPlaintext(copyCode.textContent);