Rollup merge of #128339 - GuillaumeGomez:click-code-example, r=notriddle
[rustdoc] Make the buttons remain when code example is clicked Follow-up of https://github.com/rust-lang/rust/pull/125779. One current issue we have with "run" button and the newly added copy code button is that if you're on mobile devices, you can't use them. I took a look at how `mdbook` is handling it and when you click on a code example, they show the buttons. I think it's a really good idea as if you want to copy the code on your mobile device, you will click on it, showing the buttons. Feature can be tested [here](https://rustdoc.crud.net/imperio/click-code-example/foo/struct.Bar.html). r? `@notriddle`
This commit is contained in:
commit
c2b085b4d4
@ -1477,7 +1477,20 @@ a.test-arrow:hover {
|
||||
.example-wrap:hover > .test-arrow {
|
||||
padding: 2px 7px;
|
||||
}
|
||||
.example-wrap:hover > .test-arrow, .example-wrap:hover > .button-holder {
|
||||
/*
|
||||
On iPad, the ":hover" state sticks around, making things work not greatly. Do work around
|
||||
it, we move it into this media query. More information can be found at:
|
||||
https://css-tricks.com/solving-sticky-hover-states-with-media-hover-hover/
|
||||
|
||||
However, using `@media (hover: hover)` makes this rule never to be applied in GUI tests, so
|
||||
instead, we check that it's not a "finger" cursor.
|
||||
*/
|
||||
@media not (pointer: coarse) {
|
||||
.example-wrap:hover > .test-arrow, .example-wrap:hover > .button-holder {
|
||||
visibility: visible;
|
||||
}
|
||||
}
|
||||
.example-wrap .button-holder.keep-visible {
|
||||
visibility: visible;
|
||||
}
|
||||
.example-wrap .button-holder .copy-button {
|
||||
|
@ -1829,14 +1829,22 @@ href="https://doc.rust-lang.org/${channel}/rustdoc/read-documentation/search.htm
|
||||
copyContentToClipboard(codeElem.textContent);
|
||||
}
|
||||
|
||||
function addCopyButton(event) {
|
||||
function getExampleWrap(event) {
|
||||
let elem = event.target;
|
||||
while (!hasClass(elem, "example-wrap")) {
|
||||
elem = elem.parentElement;
|
||||
if (elem.tagName === "body" || hasClass(elem, "docblock")) {
|
||||
return;
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return elem;
|
||||
}
|
||||
|
||||
function addCopyButton(event) {
|
||||
const elem = getExampleWrap(event);
|
||||
if (elem === null) {
|
||||
return;
|
||||
}
|
||||
// Since the button will be added, no need to keep this listener around.
|
||||
elem.removeEventListener("mouseover", addCopyButton);
|
||||
|
||||
@ -1858,7 +1866,20 @@ href="https://doc.rust-lang.org/${channel}/rustdoc/read-documentation/search.htm
|
||||
parent.appendChild(copyButton);
|
||||
}
|
||||
|
||||
function showHideCodeExampleButtons(event) {
|
||||
const elem = getExampleWrap(event);
|
||||
if (elem === null) {
|
||||
return;
|
||||
}
|
||||
const buttons = elem.querySelector(".button-holder");
|
||||
if (buttons === null) {
|
||||
return;
|
||||
}
|
||||
buttons.classList.toggle("keep-visible");
|
||||
}
|
||||
|
||||
onEachLazy(document.querySelectorAll(".docblock .example-wrap"), elem => {
|
||||
elem.addEventListener("mouseover", addCopyButton);
|
||||
elem.addEventListener("click", showHideCodeExampleButtons);
|
||||
});
|
||||
}());
|
||||
|
21
tests/rustdoc-gui/code-example-buttons.goml
Normal file
21
tests/rustdoc-gui/code-example-buttons.goml
Normal file
@ -0,0 +1,21 @@
|
||||
// This test ensures that code blocks buttons are displayed on hover and when you click on them.
|
||||
go-to: "file://" + |DOC_PATH| + "/test_docs/fn.foo.html"
|
||||
|
||||
// First we check we "hover".
|
||||
move-cursor-to: ".example-wrap"
|
||||
assert-css: (".example-wrap .copy-button", { "visibility": "visible" })
|
||||
move-cursor-to: ".search-input"
|
||||
assert-css: (".example-wrap .copy-button", { "visibility": "hidden" })
|
||||
|
||||
// Now we check the click.
|
||||
assert-count: (".example-wrap:not(:hover) .button-holder.keep-visible", 0)
|
||||
click: ".example-wrap"
|
||||
move-cursor-to: ".search-input"
|
||||
// It should have a new class and be visible.
|
||||
wait-for-count: (".example-wrap:not(:hover) .button-holder.keep-visible", 1)
|
||||
wait-for-css: (".example-wrap:not(:hover) .button-holder.keep-visible", { "visibility": "visible" })
|
||||
// Clicking again will remove the class.
|
||||
click: ".example-wrap"
|
||||
move-cursor-to: ".search-input"
|
||||
assert-count: (".example-wrap:not(:hover) .button-holder.keep-visible", 0)
|
||||
assert-css: (".example-wrap .copy-button", { "visibility": "hidden" })
|
Loading…
Reference in New Issue
Block a user