Overview
SDS only includes the styling - it is assumed the code for the copy process will be implemented within the project locally (example javascript below).
The copy code options currently work with textarea
, input
and pre
elements
Options
On successful copy
When the content has been successfully copied to the clipboard, you can set a class of ds-button--success
on the button. The button will turn green, and the icon will change to a tick.
Setting the attribute data-ds-texttip="Copied!"
to the button will also show a texttip indicating copy was successful.
When leaving the button hover state (i.e. onmouseout), the class ds-button--success
and the attribute data-ds-texttip
must be removed.
Javascript
The following example code implements the copy to clipboard functionality and changes the state of the button to provide user feedback.
// Copy field to clipboard
let copyFieldToClipboard = document.querySelectorAll('[class*="--copy"]');
for (let copyElement of copyFieldToClipboard) {
// copyFieldToClipboard.forEach((copyElement) => {
let copyElementSource = copyElement.querySelector("input,textarea,pre");
let copyElementButton = copyElement.querySelector('[class*="ds-button"]');
// Copy when clicked
copyElementButton.addEventListener("click", function () {
// Make sure there is an element to copy
if (!copyElementSource) {
console.log("No element to copy");
return false;
}
// Get the value or text to copy
let textToCopy =
"value" in copyElementSource ? copyElementSource.value : copyElementSource.innerText;
// Copy to the clipboard
navigator.clipboard.writeText(textToCopy).then(
function () {
// Successful, show feedback to the user
this.classList.add("--success");
this.dataset.dsTexttip = "Copied!";
}.bind(this),
function () {
// An error occurred
console.log("An error occurred");
}
);
});
// Remove success state and notification tip when exiting the button
copyElementButton.addEventListener("mouseout", function () {
this.classList.remove("--success", "ds-button --success");
delete this.dataset.dsTexttip;
});
}
Examples
Single line
The following structure is suitable for implementing an single line ‘Copy code’ control.
Input
<div class="ds-field">
<div class="ds-input --copy">
<input type="text" value=" curl ‒O http://soracom-files.s3.amazonaws.com/connect_air.sh" readonly="true">
<button class="ds-button --plain --hide-label --icon-clipboard">
<span>Copy code</span>
</button>
</div>
</div>
Pre
<div class="ds-field">
<div class="ds-input --copy">
<pre>curl ‒O http://soracom-files.s3.amazonaws.com/connect_air.sh"></pre>
<button class="ds-button --plain --hide-label --icon-clipboard">
<span>Copy code</span>
</button>
</div>
</div>
curl ‒O http://soracom-files.s3.amazonaws.com/connect_air.sh">
Multiple line
The following structure is suitable for implementing an multi line ‘Copy code’ control.
Textarea
<div class="ds-field">
<div class="ds-input --copy">
<textarea type="text" readonly="true" rows="16">[Dialer Defaults]
Modem = /dev/ttyUSB2
Baud = 460800
Init1 = AT+CFUN=1
Init2 = ATZ
Init3 = AT+CGDCONT=1,"IP","soracom.io"
Phone = *99***1#
Dial Command = ATD
Username = sora
Password = sora</textarea>
<button class="ds-button --plain --hide-label --icon-clipboard">
<span>Copy code</span>
</button>
</div>
</div>
Pre
<div class="ds-field">
<div class="ds-input --copy">
<pre>[Interface]
PrivateKey = r3A8zNOTknwwKjEORrZZ1iU99nVHJggdwTRGF5m+sJ8=
Address = 10.207.114.156/32
[Peer]
PublicKey = woha3spWgVr2luPW/8J0OLlP2Csh7r7qu9Umyh7x4Hg=
AllowedIPs = 100.127.0.0/16
Endpoint = beck.arc.soracom.io:11010</pre>
<button class="ds-button --plain --hide-label --icon-clipboard">
<span>Copy code</span>
</button>
</div>
</div>
[Interface] PrivateKey = r3A8zNOTknwwKjEORrZZ1iU99nVHJggdwTRGF5m+sJ8= Address = 10.207.114.156/32 [Peer] PublicKey = woha3spWgVr2luPW/8J0OLlP2Csh7r7qu9Umyh7x4Hg= AllowedIPs = 100.127.0.0/16 Endpoint = beck.arc.soracom.io:11010
Pre with reveal toggle
<div class="ds-field">
<div class="ds-input --copy">
<details class="ds-toggle">
<summary>
<span class="ds-tag">Show keys</span>
<span class="ds-tag --end --bottom">Hide keys</span>
</summary>
</details>
<pre>[Interface]
PrivateKey = r3A8zNOTknwwKjEORrZZ1iU99nVHJggdwTRGF5m+sJ8=
Address = 10.207.114.156/32
[Peer]
PublicKey = woha3spWgVr2luPW/8J0OLlP2Csh7r7qu9Umyh7x4Hg=
AllowedIPs = 100.127.0.0/16
Endpoint = beck.arc.soracom.io:11010</pre>
<pre aria-hidden="true">[Interface]
PrivateKey = ****************
Address = 10.207.114.156/32
[Peer]
PublicKey = ****************
AllowedIPs = 100.127.0.0/16
Endpoint = beck.arc.soracom.io:11010</pre>
<button class="ds-button --plain --hide-label --icon-clipboard">
<span>Copy code</span>
</button>
</div>
</div>
Show keys Hide keys
[Interface] PrivateKey = r3A8zNOTknwwKjEORrZZ1iU99nVHJggdwTRGF5m+sJ8= Address = 10.207.114.156/32 [Peer] PublicKey = woha3spWgVr2luPW/8J0OLlP2Csh7r7qu9Umyh7x4Hg= AllowedIPs = 100.127.0.0/16 Endpoint = beck.arc.soracom.io:11010
Pre with reveal toggle, and QR code
<div class="ds-cols">
<div class="ds-span">
<details class="ds-toggle">
<summary>
<span class="ds-tag">Show QR code</span>
<span class="--cover"></span>
</summary>
</details>
<img width="158" src="https://assets.codepen.io/178836/qr.png" />
</div>
<div class="ds-span --expand">
<div class="ds-field">
<div class="ds-input --copy">
<details class="ds-toggle">
<summary>
<span class="ds-tag">Show keys</span>
<span class="ds-tag --end --bottom">Hide keys</span>
</summary>
</details>
<pre>[Interface]
PrivateKey = r3A8zNOTknwwKjEORrZZ1iU99nVHJggdwTRGF5m+sJ8=
Address = 10.207.114.156/32
[Peer]
PublicKey = woha3spWgVr2luPW/8J0OLlP2Csh7r7qu9Umyh7x4Hg=
AllowedIPs = 100.127.0.0/16
Endpoint = beck.arc.soracom.io:11010</pre>
<pre aria-hidden="true">[Interface]
PrivateKey = ****************
Address = 10.207.114.156/32
[Peer]
PublicKey = ****************
AllowedIPs = 100.127.0.0/16
Endpoint = beck.arc.soracom.io:11010</pre>
<button class="ds-button --plain --hide-label --icon-clipboard">
<span>Copy code</span>
</button>
</div>
</div>
</div>
</div>