diff --git a/res/css/views/rooms/_EventTile.scss b/res/css/views/rooms/_EventTile.scss index 80d2cd3418..d95ed2ded0 100644 --- a/res/css/views/rooms/_EventTile.scss +++ b/res/css/views/rooms/_EventTile.scss @@ -400,6 +400,12 @@ limitations under the License. color: #333; } +.mx_EventTile_pre_container { + // For correct positioning of _copyButton (See TextualBody) + position: relative; +} + +// Inserted adjacent to
blocks, (See TextualBody) .mx_EventTile_copyButton { position: absolute; display: inline-block; @@ -413,7 +419,6 @@ limitations under the License. } .mx_EventTile_body pre { - position: relative; border: 1px solid transparent; } @@ -422,7 +427,7 @@ limitations under the License. border: 1px solid #e5e5e5; // deliberate constant as we're behind an invert filter } -.mx_EventTile_body pre:hover .mx_EventTile_copyButton +.mx_EventTile_body .mx_EventTile_pre_container:hover .mx_EventTile_copyButton { visibility: visible; } diff --git a/src/components/views/messages/TextualBody.js b/src/components/views/messages/TextualBody.js index 20cf2b69f4..2e5fe2aabc 100644 --- a/src/components/views/messages/TextualBody.js +++ b/src/components/views/messages/TextualBody.js @@ -340,7 +340,18 @@ module.exports = React.createClass({ }, false); e.target.onmouseleave = close; }; - p.appendChild(button); + + // Wrap a div aroundso that the copy button can be correctly positioned + // when theoverflows and is scrolled horizontally. + const div = document.createElement("div"); + div.className = "mx_EventTile_pre_container"; + + // Insert containing div in place ofblock + p.parentNode.replaceChild(div, p); + + // Appendblock and copy button to container + div.appendChild(p); + div.appendChild(button); }); },