Add copy code button to code snippets (#945)

Hello everyone, this is my implementation for the copy button on the snippet (requested in #924)

The implementation is made 100% javascript as with or without a jekyll template modification you still have to execute some javascript code, and I consider it the best choice.

the button only appears if the mouse is over it, to allow the entire line to be read

the important CSS changes were made to make the copy button work even in the long code situation:


![image](https://user-images.githubusercontent.com/26844016/187731472-d4bf7828-2356-4d94-9c2d-9db863228f5f.png)

to avoid this:

![image](https://user-images.githubusercontent.com/26844016/183292313-d7f73d7d-58c0-4c7b-b5ba-e08bd285514b.png)

Co-authored-by: Matt Wang <matt@matthewwang.me>
This commit is contained in:
Simone
2022-12-27 01:45:37 +01:00
committed by GitHub
parent 56bda83528
commit ce3f34bbc7
6 changed files with 154 additions and 25 deletions

View File

@@ -3,12 +3,15 @@
// {% raw %}
code {
padding: 0.2em 0.15em;
font-weight: 400;
background-color: $code-background-color;
border: $border $border-color;
border-radius: $border-radius;
// This instruction applies to all queues not within 'pre', avoiding 'code' generated by the highlight.
:not(pre) {
& > code {
padding: 0.2em 0.15em;
font-weight: 400;
background-color: $code-background-color;
border: $border $border-color;
border-radius: $border-radius;
}
}
// Avoid appearance of dark border around visited code links in Safari
@@ -47,18 +50,77 @@ a:visited code {
// Kramdown line_numbers = true: fences have a wider gutter than with Liquid?
// ```[LANG]...```
// the code may appear with 3 different types:
// container \ case: default case, code with line number, code with html rendering
// top level: div.highlighter-rouge, div.listingblock > div.content, figure.highlight
// second level: div.highlight, .table-wrapper, pre
// third level: pre.highlight, td.code, absent
// last level: code, pre, code (optionality)
// highlighter level: span, span, span
// the spacing are only in the second level for case 1, 3 and in the thirt level for case 2
// select top level container
div.highlighter-rouge,
div.listingblock > div.content {
padding: $sp-3;
div.listingblock > div.content,
figure.highlight {
margin-top: 0;
margin-bottom: $sp-3;
overflow-x: auto;
background-color: $code-background-color;
border-radius: $border-radius;
box-shadow: none;
-webkit-overflow-scrolling: touch;
position: relative;
padding: 0;
// copy button (or other button)
// the button appear only when there is a hover on the code or focus on button
> button {
width: $sp-3;
opacity: 0;
position: absolute;
top: 0;
right: 0;
border: $sp-3 solid $code-background-color;
background-color: $code-background-color;
color: $body-text-color;
box-sizing: content-box;
svg {
fill: $body-text-color;
}
&:active {
text-decoration: none;
outline: none;
opacity: 1;
}
&:focus {
opacity: 1;
}
}
// the button can be seen by doing a simple hover in the code, there is no need to go over the location of the button
&:hover {
> button {
cursor: copy;
opacity: 1;
}
}
}
// setting the spacing and scrollbar on the second level for the first case
// remove all space on the second and thirt level
div.highlighter-rouge,
div.listingblock {
div.highlight {
overflow-x: auto;
padding: $sp-3;
margin: 0;
border: 0;
}
div.highlight,
pre.highlight,
code {
padding: 0;
@@ -69,19 +131,15 @@ div.listingblock > div.content {
// {% highlight LANG %}...{% endhighlight %},
// {% highlight LANG linenos %}...{% endhighlight %}:
figure.highlight {
padding: $sp-3;
margin-top: 0;
margin-bottom: $sp-3;
overflow-x: auto;
background-color: $code-background-color;
border-radius: $border-radius;
box-shadow: none;
-webkit-overflow-scrolling: touch;
// setting the spacing and scrollbar on the second level for the thirt case
// the css rule are apply only to the last code enviroment
// setting the scroolbar
figure.highlight {
pre,
code {
padding: 0;
:not(pre) > code {
overflow-x: auto;
padding: $sp-3;
margin: 0;
border: 0;
}
@@ -89,6 +147,8 @@ figure.highlight {
// ```[LANG]...```, kramdown line_numbers = true,
// {% highlight LANG linenos %}...{% endhighlight %}:
// setting the spacing and scrollbar on the thirt level for the second case
.highlight .table-wrapper {
padding: 0;
margin: 0;
@@ -108,6 +168,7 @@ figure.highlight {
td.gl {
width: 1em;
padding-right: $sp-3;
padding-left: $sp-3;
}
pre {
@@ -116,10 +177,7 @@ figure.highlight {
}
}
//
// Code examples (rendered)
//
// Code examples: html render of a code
.code-example,
.listingblock > .title {
padding: $sp-3;